python——函数
Posted 郭东东郭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python——函数相关的知识,希望对你有一定的参考价值。
1.关于函数参数:默认参数、关键参数、非固定参数
(1)默认参数
def stu_register(name, age, country=‘China‘):
print(‘注册信息‘.center(30, ‘-‘))
print(‘姓名:‘, name)
print(‘年龄:‘, age)
print(‘国籍:‘, country)
stu_register(‘李白‘, 40)
stu_register(‘李白‘, 40, ‘大唐‘)
country=‘China‘
为默认参数,默认参数必须放在默认参数后面才符合语法要求,调用函数的时候默认参数可以不传,如果传的话则以传入的参数为准
(2)关键参数
正常情况下,给函数传参是按顺序传,不想按顺序传,就可以用关键参数,即传参时候指定参数名。
关键参数必须要放在位置参数之后。
def stu_register(name, age, country=‘China‘):
print(‘注册信息‘.center(30, ‘-‘))
print(‘姓名:‘, name)
print(‘年龄:‘, age)
print(‘国籍:‘, country)
stu_register(‘小钻风‘, country=‘赛博坦‘, age=25)
stu_register(‘奇异博士‘, country=‘赛博坦‘, 25) # 这种方式是错误的
(3)非固定参数
在定义函数时不确定会传入多少个参数,可以使用非固定参数
def fun1(*args):
print(args)
fun1(‘李白‘, 22, ‘诗人‘)
fun1(‘鸣人‘, 25, ‘螺旋丸‘, ‘雏田‘, ‘疾风传‘)
#打印结果:
#(‘李白‘, 22, ‘诗人‘)
#(‘鸣人‘, 25, ‘螺旋丸‘, ‘雏田‘, ‘疾风传‘)
**kwargs 多传入的参数变成一个dict形式
def fun2(name, age, *args, **kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name, age, args, kwargs)
fun2(‘我爱罗‘, 30)
fun2(‘卡卡西‘, 35, ‘千鸟‘, ‘神威‘, ‘写轮眼‘, students=‘鸣人、佐助、小樱‘, teacher=‘木叶闪光‘)
#打印结果:
#我爱罗 30 () {}
#卡卡西 35 (‘千鸟‘, ‘神威‘, ‘写轮眼‘) {‘students‘: ‘鸣人、佐助、小樱‘, ‘teacher‘: ‘木叶闪光‘}
2.局部变量
name = "大白"
def change_name():
name = "小黑"
print(‘函数内部打印:‘, name)
change_name()
print(‘函数外部打印:‘, name)
#打印结果:
#函数内部打印: 小黑
#函数外部打印: 大白
结论:定义在函数外部一级代码的变量,即全局变量,全局可用,定义在函数内部的变量,即内部变量,只能在局部使用。
如果全局变量和局部变量都有一个变量叫 name,函数使用时查找变量的顺序是就近原则,由内到外
另外,python中,无法通过这种方式更改全局变量 name 的值
如何在函数中修改全局变量
name = ‘李白‘
def fun():
global name #global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "Alex Li"即使不写,程序最后面的print也可以打印name
name = ‘杜甫‘
print(‘函数内部:‘, name)
fun()
print(‘函数外部:‘, name)
#打印结果:
#函数内部: 杜甫
#函数外部: 杜甫
另外补充一个小尾巴:
names = [‘鸣人‘, ‘佐助‘, ‘小樱‘]
def change():
names[0] = ‘六代目火影‘
print(‘函数内:‘, names)
change()
print(‘函数外:‘, names)
#打印结果:
#函数内: [‘六代目火影‘, ‘佐助‘, ‘小樱‘]
#函数外: [‘六代目火影‘, ‘佐助‘, ‘小樱‘]
#内容被改了,因为列表里面存的是内存地址,是可以修改的,类似于,元祖本身不可修改,但是元祖中包含的列表内容是可以修改的。
列表、字典、集合、对象是可以修改的,包括包含列表等类型的元祖。不可修改的有字符串、数字、布尔
3.函数嵌套
- 函数内部可以再定义函数,所有函数只要执行必须先调用
def fun1():
print(‘鸣人‘)
def fun2():
print(‘博人‘)
fun2() #fun2 只能在 fun2函数定义后才可以调用
fun1() #fun2 只能在 fun1 中调用,在fun1 外面无法调用
#鸣人
#博人
4.作用域
#python 中 函数就是一个作用域
age = 18
def fun1():
age = 73
def fun2():
print(age)
return fun2
print(fun1()) # 打印结果:(函数地址)<function fun1.<locals>.fun2 at 0x00000000027A8AE8>
val = fun1()
val() # 打印结果:73 此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。
此处打印的部署18,是73,说明代码定义完成后,作用域已生成,作用域链向上查找。
而不是:把fun2函数返回后,在外面调用,就变成全局的了,内部函数依然在内部执行。
5.匿名函数
不需要使用 def 来定义一个函数,直接使用lambda来创建,不能访问自有参数列表之外或全局命名空间的参数。
f = lambda x, y:x * y # 声明一个匿名函数
print(f(2,3)) # 6
以上代码 :前面的 x,y是参数 , : 后面的是返回内容
- 匿名函数可以与其他函数搭配使用,如filter、map等
- 程序一次性使用、不需要定义函数名时,匿名函数可以节省内存中变量定义的空间
- 一般有一行表达式,必须有返回值,但不能有return
- 可以没有参数,也可以有多个参数,允许参数存在默认值
#无参匿名函数
>>> f = lambda:True
>>> f()
True
#带参匿名函数
lambda x: x**3 #一个参数
lambda x,y,z:x+y+z #多个参数
lambda x,y=3: x*y #允许参数存在默认值
>>> c = lambda x,y=2: x+y #使用了默认值
>>> c(10) #如果不输入,就使用默认值2
12
再举个栗子:
data = range(10)
print(list(map(lambda x:x*2, data))) #打印结果: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
map(func, *iterables)
, map会把data中的每个数当做参数,传入 该匿名函数,然后返回,最终会返回一个列表,我们用list() 强制转换一下,转换之前打印出的是 列表的地址。
以上是关于python——函数的主要内容,如果未能解决你的问题,请参考以下文章