Python函数

主要内容:
1.函数 的定义及简单使用

2.函数嵌套使用

3.变量类型

4.函数参数使用

5.函数中的引用问题

6.递归函数

7.匿名函数

1.函数定义及调用

1)一块具有独立功能的代码块,重复使用,那么就需要函数,使用函数将这块代码封装成一个整体;
2)函数定义
def test(a,b)
    print("%d"%(a+b))
3)函数调用
test(1,2)
2.函数参数
#函数定义
def sum(num1,num2):#形参
    return num1+num2
#函数调用
num1 = int(input("请输入num1:"))
num2 = int(input("请输入num2:"))
print("%d+%d的和为:%d"%(num1,num2,sum(num1,num2)))#实参
'''结果:
请输入num1:12
请输入num2:15
12+15的和为:27
'''
3.函数返回值
return
1)可以把一个结果返回给被调用者;
2)结束一个函数
3)如果一个函数中编写了多个return,那么程序不会出现语法错误,原因是第一个return被执行后,函数就结束了,接下来的return都不会被执行;
4.函数类型
1)无参数,无返回值
2)无参数,有返回值
3)有参数,无返回值
4)有参数,有返回值
5.函数应用
#函数定义
# def sum(num1,num2):
#     return num1+num2
# 函数调用
# num1 = int(input("请输入num1:"))
# num2 = int(input("请输入num2:"))
# print("%d+%d的和为:%d"%(num1,num2,sum(num1,num2)))
'''结果:
请输入num1:12
请输入num2:15
12+15的和为:27

'''

6.学生管理系统(函数版)

#打印信息
def printMeau():
    print("*" * 30)
    print("欢迎你使用本系统")
    print("1:添加新的用户")
    print("2:删除指定用户")
    print("3:修改用户信息")
    print("4:查询一个用户")
    print("5:查询所有用户的信息")
    print("0:退出系统")
    print("*" * 30)
#定义一个列表,存储所有的名字
nameList = []
#添加用户信息
def addStuInfo():
    # 提示输入一个名字
    name1 = input("请输入新增用户名:")
    sex1 = input("请输入新增用户性别:")
    phone1 = input("请输入新增用户联系方式:")
    # 字典存储用户信息;名字、性别、手机号
    userInfo = {}
    # 将用户的基本信息添加到字典中
    userInfo["name"] = name1
    userInfo["sex"] = sex1
    userInfo["phone"] = phone1
    # 将该用户添加到用户列表
    nameList.append(userInfo)
#删除用户
def  deleteUser():
#输入删除的名字
        name2 = input("输入需要删除的名字:")
        flag = 0
        #将该名字从列表中删除
        for temp in nameList:
             if temp["name"]==name2:
                 nameList.remove(temp)
                 flag = 1
                 break
        if flag ==0:
                 print("该用户不在了名单中,无法删除")
        else:
                print("删除成功!")
        print(nameList)
#修改用户信息
def updateUser():
    # 输入需要修改的名字
    name3 = input("输入需要修改的名字:")
    rename = input("输入修改后的名字:")
    # 在列表中修改名字
    for temp in nameList:
        if temp["name"] == name3:
            temp["name"] = rename
        else:
            print("用户不存在,无法修改")
#查询所有用户
def findUser():
    # 输入需要查询的名字
    name4 = input("输入查询的名字:")
    # 给出查询结果
    for temp in nameList:
        if temp["name"] == name4:
            print("恭喜你,%s在花名册中" % name4)
        else:
            print("很遗憾,花名册中没有%s" % name4)
def findAll():
    # c查询所有人
    for name in nameList:
        print("姓名为:%s--性别为:%s--联系方式为:%s" % (name["name"], name["sex"], name["phone"]))
    print()
#学生管理系统
def main():
    # 打印提示选择
    printMeau()

    while True:
        #获取要操作的数字
        choose = int(input("请输入选择编号:"))
        # 根据选择来做相应的事情
        if choose==1:
            addStuInfo()
            #print(nameList)
        elif choose==2:
            deleteUser()
        elif choose==3:
            updateUser()
        elif choose ==4:
            findUser()
        elif choose ==5:
            findAll()
        elif choose==0:
            # 退出系统
            break
        else:
            print("你的输入不正确,请检查后重新输入!")

'''
请输入选择编号:1
请输入新增用户名:谢霆锋
请输入新增用户性别:男
请输入新增用户联系方式:10086
[{'name': '谢霆锋', 'sex': '男', 'phone': '10086'}]
请输入选择编号:1
请输入新增用户名:张靓颖
请输入新增用户性别:女
请输入新增用户联系方式:10084
[{'name': '谢霆锋', 'sex': '男', 'phone': '10086'}, {'name': '张靓颖', 'sex': '女', 'phone': '10084'}]
请输入选择编号:2
输入需要删除的名字:张靓颖
删除成功!
[{'name': '谢霆锋', 'sex': '男', 'phone': '10086'}]
请输入选择编号:3
输入需要修改的名字:谢霆锋
输入修改后的名字:锋
请输入选择编号:4
输入查询的名字:锋
恭喜你,锋在花名册中
请输入选择编号:5
姓名为:锋--性别为:男--联系方式为:10086

'''

7. 定义函数和调用函顺序
1)如果有两个定义完全相同的函数,那么在调用函数的时候,后边的函数结果会将前边的覆盖掉(等同于在字典中出现了相同的key的情况)
def print1():
    print("今天是个好天气")
def print1():
    print("明天也是一个好天气")
print1()
'''结果(输出结果覆盖)
明天也是一个好天气
'''
2)不允许出现函数调用在函数声明之前,如下形式:
test1()
def test1():
    print("参加考试")

8. 函数嵌套调用
1)方式一
def printDemo(n):
    i = 0
    while i < n:
        print("*")
        print("**")
        print("***")
        i+=1
num = int(input("请输入需要打印次数:"))
printDemo(num)
'''结果:
请输入需要打印次数:2
*
**
***
*
**
***
'''
2)方式二
#控制打印
def printDemo():
    print("*")
    print("**")
    print("***")
def printUser(n):
    i = 0
    while i<n:
        printDemo()
        i+=1
num = int(input("请输入需要打印次数:"))
printUser(num)
'''结果:
请输入需要打印次数:2
*
**
***
*
**
***
'''
3)总结:
方式二由于方式一,在函数定义时,尽量使功能实现更加的趋向于模块化(特定的函数实现特定的功能),降低代码的耦合性(模块间的关联程度),从而降低修改带来的成本;

9. 函数嵌套练习
1)求和
def numSum(num1,num2,num3):
    return num1+num2+num3
print("请输入求运算的三个数:")
i = 1
#列表存储
num = []
while i<=3:
    num1 = input("请输入第%d个数:"%i)
    #将输入的数逐一添加到列表
    num.append(num1)
    i+=1
print(num)
sum1 = numSum(num[0],num[1],num[2])#如果不进行类型转换为字符型,+进行字符串连接
print(sum1)
'''结果
请输入求运算的三个数:
请输入第1个数:1
请输入第2个数:2
请输入第3个数:3
['1', '2', '3']
123
'''

sum1 = numSum(int(num[0]),int(num[1]),int(num[2]))#对列表中取出的数进行类型转换后运算
print("三个数之和为%d"%sum1)
'''
请输入第1个数:1
请输入第2个数:2
请输入第3个数:3
['1', '2', '3']
三个数之和为6
'''
2)求平均数
a.方式1:直接定义
def numAvg(num1,num2,num3):
    sum = num1+num2+num3
    return sum/3
print("请输入求运算的三个数:")
i = 1
num = []
while i<=3:
    num1 = input("请输入第%d个数:"%i)
    num.append(num1)
    i+=1
avg1  = numAvg(int(num[0]),int(num[1]),int(num[2]))
print("三个数平均数为%d"%avg1)
'''
请输入求运算的三个数:
请输入第1个数:1
请输入第2个数:2
请输入第3个数:3
三个数平均数为2
'''
b.方式2:嵌套调用
def numSum(num1,num2,num3):
    return num1+num2+num3
def numAvg(num1,num2,num3):
    return numSum(num1,num2,num3)/3#调用定义的numSum函数实现功能
print("请输入求运算的三个数:")
i = 1
num = []
while i<=3:
    num1 = input("请输入第%d个数:"%i)
    num.append(num1)
    i+=1
avg1  = numAvg(int(num[0]),int(num[1]),int(num[2]))
print("三个数平均数为%d"%avg1)
'''
请输入求运算的三个数:
请输入第1个数:1
请输入第2个数:2
请输入第3个数:3
三个数平均数为2
'''

10. 局部变量和全局变量
1)局部变量

定义在函数内部的变量,只在函数内部有效,其中形参也为局部变量;
局部变量可以出现多个参数同名,但全局变量不会出现多个参数同名;
import time
def time1():
    num = 100
    print(num)
def time2():
    num = 200
    print(num)
    time.sleep(1)
    num = num+100
    print(num)
time1()
time2()
'''结果:
100
200
300
'''
2)全局变量

在函数外部调用的变量,使用关键字global修饰
#全局变量
num = 100
def printNum():
    #全局变量在使用时必须添加global,才可以使用
    global  num
    print(num)
    num+=10
    print(num)
printNum()
'''结果:
100
110
'''

11. 函数返回值

1)返回一个值

def sum1(num1,num2):
    return num1+num2
print(sum1(11,22))

2)返回多个值
三种方式:列表[]、元组()、字典{}

a.列表形式

def sum1(num1,num2):
    return [num1,num2,num1+num2]#列表
print(sum1(11,22))
'''结果
[11, 22, 33]
'''
b.元组形式
def sum1(num1,num2):
    return (num1,num2,num1+num2)#元组
print(sum1(11,22))
'''结果
(11, 22, 33)
''
c.字典形式
def sum1(num1,num2):
    return {num1,num2,num1+num2}#字典
print(sum1(11,22))
'''结果
{33, 11, 22}
'''

12. 缺省参数
def print1(a,b,c=3.5):
    print(a)
    print(b)
    print(c)
print1(11,22,33)
print("*"*30)
print1(11,22)
'''结果:
11
22
33
******************************
11
22
3.5
'''

13. 不定长参数
#不定长参数
def print2(num1,num2,*args,**kwargs):
    print(num1)
    print(num2)
    print(args)
    print(kwargs)
A = [11,22,33]
B = {"aa":100,"bb":200}
#print2(11,22,A,B)
'''结果:
11
22
([11, 22, 33], {'aa': 100, 'bb': 200})
{}
'''
#print2(11,22,*A,B)
'''结果
11
22
(11, 22, 33, {'aa': 100, 'bb': 200})
{}
'''
print2(11,22,*A,**B)
'''结果:
11
22
(11, 22, 33)
{'aa': 100, 'bb': 200}
'''
说明:当列表/元组作为实参传递时,如果前面有一个*,表示对其进行解包,
即:[11,22,33]---------->11,22,33
当字典作为实参传递时,如果前面有两个*,表示对其进行解包,
即:{"aa":100,"bb":200}---->aa=100,bb=200

14. 引用

1) python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象,修改时直接修改其值(内存地址不会变化)。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值'来传递对象,修改时给予一块新的内存空间(而不指向原本的内存空间)。

2) 当人们复制列表或字典时,就复制了对象列表的引用同,如果改变引用的值,则修改了原始的参数。

3.)为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

4)数字类型修改

a = 100
b  = a
print("a的内存地址",id(a))
print("b的内存地址:",id(b))
a = 200
print("a修改后的内存地址",id(a))
print("此时b的内存地址",id(b))
'''
a的内存地址 1400200480
b的内存地址: 1400200480
a修改后的内存地址 1400202080
此时b的内存地址 1400200480
'''
5)列表类型修改

a = [11,22,33]
b  = a
print("a的内存地址",id(a))
print("b的内存地址:",id(b))
a.append(44)
print("a修改后的内存地址",id(a))
print("此时b的内存地址",id(b))
'''结果:
a的内存地址 48453752
b的内存地址: 48453752
a修改后的内存地址 48453752
此时b的内存地址 48453752
'''
15. 函数的传递引用
1)练习1
def test(a,b):
    print(id(a))#a的引用地址于A是同一块地址
    a = a+1
    print(id(a))#修改a的值之后,a指向新的内存空间
A = 100
B = 200
print(id(A))
test(A,B)
'''结果:
1387486496
1387486496
1387486512
'''
2)在函数中列表a=a+a与a+=a不同
def test(a,b):
    print(id(a))
    a = a+a#原来列表取过来后,生成新的列表
    print(id(a))
A = [11,22]
B = 200
test(A,B)
print(A)
'''
55400568
55369520
[11, 22]
'''
def test1(a,b):
    print(id(a))
    a +=a#在原来的列表上直接修改,在[11,22]后在添加[11,22]
    print(id(a))
A = [11,22]
B = 200
test1(A,B)
print(A)
'''
55369600
55369600
[11, 22, 11, 22]
'''
注意:对于可变数据类型

a+=a与a=a+a不一样

16. 递归函数
递归函数:在函数内部调用函数本身;
1)循环计算阶乘
i = 1
result =1
while i<=10:
    result = result*i
    i+=1
print(result)
'''结果:
3628800
'''
2)使用递归完成阶乘
def jieCheng(a):
    # print(a)
    if a == 1:
        return 1
    else:
        return  a*jieCheng(a-1)
num = int(input("输入求阶乘的数:"))
print(jieCheng(num))
'''结果:
输入求阶乘的数:10
3628800
'''

17. 匿名函数

省略了使用def声明函数的标准步骤
#匿名函数lambada
def test(a,b):
    return  a+b
aa = lambda a,b:a+b
print(test(11,12))
print(aa(7,8))
'''结果:
23
15
'''
使用说明:能接受任何数量的参数但只能返回一个表达式的值;
不能直接使用print,只需要一个表达式
应用场合:
1)函数作为参数传递
def test(a,b,aa):
    return aa(a,b)
result = test(11,22,lambda a,b:a+b)
print(result)
'''
33
'''
2)应用于sort排序
nameLsit = [{"xuhao":2,"age":24},{"xuhao":1,"age":26},{"xuhao":5,"age":4}]
print("原本顺序:",nameLsit)
#print(nameLsit.sort(key=nameLsit[0]))
nameLsit.sort(key=lambda x:x["xuhao"])#x相当于字典,参数顺序和逆序可以使用reverse设置
print("排序之后:",nameLsit)
'''
原本顺序: [{'xuhao': 2, 'age': 24}, {'xuhao': 1, 'age': 26}, {'xuhao': 5, 'age': 4}]
排序之后: [{'xuhao': 1, 'age': 26}, {'xuhao': 2, 'age': 24}, {'xuhao': 5, 'age': 4}]
'''

18.函数总结

1)函数传递中的参数

不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

2)函数定义规则

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值