1.函数的返回值
>>> def get_values():
... return 1,2,3
...
>>> print(get_values())
(1, 2, 3)
#函数的返回值只能是一个值,返回多个内容时会组成一个“tuple”返回
#可用列表实现返回多个值
>>> type(get_values())
<class 'tuple'>
>>> for i in get_values():
... print(i)
...
1
2
3
2.局部变量和全局变量
>>> def a():
... x=100
... print(x) #x(局部变量)在函数中,在函数外不能访问无意义
...
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x=100 #普通变量
>>> def a():
... print(x)
...
>>> a()
100
>>> x=100
>>> def a():
... x=6
... print(x)
...
>>> a()
6
>>> x
100
"""
1 x(局部变量)在函数里面有一个且赋值了,在函数外面也有一个x。
那么两个x都是互相独立,不干扰的。
2 x在函数里面有一个且没有赋值了,在函数外面也有一个x。
这两个x是同一个值。
3 x在函数里面有一个且赋值了,在函数外面也有一个x,
想让这两个x关联在一起,使用global
"""
>>> x=100
>>> def a():
... global x #全局变量
... print(x)
... x=123
... return x
...
>>> x
100
>>> a()
100
123
>>> x=939
>>> a()
939
123
>>> s=100
>>> def ss():
... s=s+1
...
>>> ss()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in ss
UnboundLocalError: local variable 's' referenced before assignment
全局变量名和函数名不能相同。此外,若局部变量名与全局变量名或函数名相同,则在该局部变量作用范围内不能使用相应的全局变量或函数。
3.不可变参数和可变参数
可变类型 Vs 不可变类型
可变类型(mutable):列表,字典
不可变类型(unmutable):数字,字符串,元组
这里的可变不可变,是指内存中的那块内容(value)是否可以被改变
#不可变参数
>>> s='abc' #不可变类型
>>> def func(a):
... a=a+'d'
... return a
...
>>> s
'abc'
>>> print(func(s))
abcd
>>> s
'abc'
>>>
>>>
>>> l=[1,2,3] #可变类型
>>> def funb(b):
... b.append(4)
... return b
...
>>> print(funb(l))
[1, 2, 3, 4]
>>> l #list改变
[1, 2, 3, 4]
*如何保证传入参数list不变
>>> print(funb(list(l))) #相当于传入list(l)为参数,不会改变原有l
[1, 2, 3, 4]
>>> l
[1, 2, 3]
*参数有默认值
>>> def func(a=100):
... print(a)
...
>>> func() #若没有默认值,则此调用方法会报错
100
>>> func(200)
200
#默认值参数须放在非默认值参数之后
>>> def func(a=100,b):
... print(a,b)
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
>>> def func(b,a=100):
... print(a,b)
...
>>> func(1)
100 1
>>> func(1,2)
2 1
>>> func(a=1,b=2)
1 2
*可变参数
>>> def func(a,b,*c):
... print(a)
... print(b)
... print(type(c))
... print(c)
...
>>> func(1,2)
1
2
<class 'tuple'>
()
>>> func(1,2,3,4,5)
1
2
<class 'tuple'>
(3, 4, 5)
#所有参数求和
>>> def func(a,b,*c): #可变参数
... result=0
... result+=a
... result+=b
... for i in c:
... result+=i
... return result
...
>>> func(1,2)
3
>>> func(1,2,4)
7
>>> func(1,2,4,2,3)
12
>>> def fund(a,b,**d):
... print(a)
... print(b)
... print(type(d))
... print(d)
...
>>> fund(1,2,m=3,n=5)
1
2
<class 'dict'>
{'m': 3, 'n': 5}
>>> fund(1,2)
1
2
<class 'dict'>
{}
#所有参数求和
>>> def fund(a,b,**d):
... result=0
... result=a+b
... for i in d.values():
... result+=i
... return result
...
>>> fund(1,2,m=3,n=5)
11
>>> fund(1,2,m=3,n=5,c=332)
343
>>> def fund(a,b,*c,**d):
... result=0
... result=a+b
... for i in c:
... result+=i
... for i in d.values():
... result+=i
... return result
...
>>> fund(1,2,3,4,21,5,m=2,o=3,t=3)
44
#解包:*是list和tuple解包,**是dict解包
>>> fund(1,2,3,4,[1,2,3],m=2,o=3,t=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in fund
TypeError: unsupported operand type(s) for +=: 'int' and 'list'
>>> fund(1,2,3,4,*[1,2,3],m=2,o=3,t=3) #list不能直接传,需要用*进行“解包”操作
#以上代码相当于fund(1,2,3,4,1,2,3,m=2,o=3,t=3)
24
>>> s
{'x': 9, 'y': 4}
>>> fund(1,2,3,4,s,m=2,o=3,t=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in fund
TypeError: unsupported operand type(s) for +=: 'int' and 'dict'
>>> fund(1,2,3,4,**s,m=2,o=3,t=3)
31
4.lambda函数(匿名函数)
>>> y=lambda x:x+1
>>> y #y只是存储lambda函数的变量
<function <lambda> at 0x0000016D4D6329D8>
>>> y(1)
2
>>> y=lambda x,y:x*y
>>> y(3,4)
12
>>> m=y
>>> m
<function <lambda> at 0x0000016D4D636318>
>>> m(4,5)
20