函数的定义有以下规则:
def 函数名(参数):
函数体
# 输出hello world函数
def HelloWorld():
print('Hello world')
# 函数调用
HelloWorld()
在函数调用时,可以不传送值的参数;或者说,有默认值的参数
# 例1:
#!/usr/bin/python3
import random
def choose_num(s,e=10):
num = random.randint(s,e)
return num
choose_num(3) # 调用时只传了s,未传e,e用的默认值
输出 5
choose_num(1,50) # 默认值被覆盖
输出 28
# 示例2,默认值必须在最后
#!/usr/bin/python3
def choose_num(s=10,e): # 默认值放前边,报错了。
num = random.randint(s,e)
return num
choose_num(3)
报错
File "<ipython-input-18-16c067f4bcb8>", line 1
def choose_num(s=10,e):
^
SyntaxError: non-default argument follows default argument
def choose_num(s, e=10, n=5):
numbers = []
for x in range(n):
num = random.randint(s,e)
numbers.append(num)
return numbers
choose_num(3)
输出
[6, 7, 4, 3, 8]
# 示例3,默认值只分配一次
#!/usr/bin/python3
def f(a,L=[]): # 由于默认值只在内存里分配一次,所以当此列表做默认值时,
L.append(a) # 结果不管调用多少次,都是往已经分配好的列表中追加的
return L # 就是结果中的样子。
# 而不是第一次返回 [1] 第二次返回[2] 第三次返回[3]
print(f(1))
print(f(2))
print(f(3))
输出
[1]
[1, 2]
[1, 2, 3]
示例代码:
#!/usr/bin/python3
def car(color,price='10',user='yhyang'):
print(f'{user}有一辆{color}色的车,价值{price}块')
car('蓝') # 其它的使用默认参数
car('红','30','hmm') # 对应位置覆盖
car(color='blue',price='100',) # k=v的方式给参数传值,
输出
yhyang有一辆蓝色的车,价值10块
hmm有一辆红色的车,价值30块
yhyang有一辆blue色的车,价值100块
用 *args , **kwargs
作参数,args->tuple,kwargs->dict
示例代码:
#!/usr/bin/python3
def car(*args): # 一个*号跟args,即 *args 可以成为一个元组
print(args) # 两个*号跟kwargs 即 **kwargs 可以成为一个字典
for k in args: # 重点在于*号有几个,不在于args kwargs的名称
print(k)
car("red",10,"yhyang")
输出
('red', 10, 'yhyang')
red
10
yhyang
#!/usr/bin/python3
def car(**kw): # 这种参数,在传递的时候需要传递 key=value的方式,才能按字典的方式存储并打印
for k,v in kw.items():
print(f'{k}::{v}')
car(color='red',price=20,user='yhyang')
输出
color::red
price::20
user::yhyang
#!/usr/bin/python3
def car(*args,**kw): # 可以识别单个参数和key value参数
print('args:',args)
print('kw:',kw)
for k in args:
print(k)
for k,v in kw.items():
print(f'{k}::{v}')
car('adfsdf','t',color='red',price=20,user='yhyang') # 可以识别单个参数和key value参数
输出
args: ('adfsdf', 't')
kw: {'color': 'red', 'price': 20, 'user': 'yhyang'}
adfsdf
t
color::red
price::20
user::yhyang
示例代码:
#!/usr/bin/python3
kwargs = {'color':'red','price':30,}
def car(**kw):
print(kw)
car(**kwargs) #这里注意,传字典名字的时候前面要加两个*
输出
{'color': 'red', 'price': 30}
示例代码:
#!/usr/bin/python3
def car(color='blue',*,price):
print(color,price)
car(price=30)
输出
blue 30
示例代码:
#!/usr/bin/python3
def add(x,y):
"""Add x and y together.""" # 函数文档说明,写在函数定义的第一行,就可以用
return x+y # 函数名.__doc__来查看函数说明文档
add.__doc__
输出
'Add x and y together.'
#!/usr/bin/python3
def add(x:int, y:'这个参数随便')-> int:
"""Add x and y together."""
return x+y
add.__doc__
add.__annotations__
输出
'Add x and y together.'
{'x': int, 'y': '这个参数随便', 'return': int}
变量作用域,在自己屋干自己的事儿
# 以下代码会报错
#!/usr/bin/python3
x = 1 # 全局
def add():
x += 1 # 局部变量赋值错误,此处x没有被声明,所以不能被赋值,此处x不是全局的x
print(x)
add()
error_list = [2,3,5]
def big_list():
error_list += [99] # 此处是error_list = error_list + [99],需要先在函数内部声明error_list,才不会报错
print(error_list)
big_list()
示例代码:
#!/usr/bin/python3
error_list = [2,3,5]
def big_list():
error_list.append(88) # 此处是在全局变量的基础上追加,所以可以。
print(error_list)
big_list()
输出
[2, 3, 5, 88]
error_list = [2,3,5]
def big_list():
error_list = [] # 事先声明才能做下边的 += 操作
error_list += [99]
print(error_list)
big_list()
输出
[99]
函数是python里面的一级对象,可以用在任何地方,函数里的作用域属于封闭作用域
# 函数嵌套
#!/usr/bin/python3
def calc(x,y):
def add(x,y):
print('x+y:',x+y)
def sub(x,y):
print('x-y:',x-y)
def mul(x,y):
print('x*y:',x*y)
add(x,y) # 在函数内部直接执行嵌套的函数
sub(x,y)
calc(2,5)
输出
x+y: 7
x-y: -3
# 返回值为函数本身
#!/usr/bin/python3
def calc(x,y):
def add(x,y):
print('x+y:',x+y)
def sub(x,y):
print('x-y:',x-y)
def mul(x,y):
print('x*y:',x*y)
add(x,y) # 在函数内部直接执行嵌套的函数
sub(x,y)
return mul # 返回 mul函数本身,可以赋给变量
calc(3,5)
输出
x+y: 8
x-y: -2
<function __main__.calc.<locals>.mul(x, y)>
c = calc(3,5) # c 被赋值为mul函数
输出
x+y: 8
x-y: -2
函数返回值为内部函数的名字,内部函数又处理外层函数变量;这个整体叫闭包
示例代码:
# 闭包
#!/usr/bin//python3
def hello():
s = 'yhyang' # s变量在函数中是自由变量
def say():
print(s)
return say # 返回内部函数名,内部函数绑定了外层函数的变量
hello()
h = hello()
h() # h 得到的值为say()函数,再次执行,则会用到外层函数的变量s
输出
<function __main__.hello.<locals>.say()>
yhyang
函数闭包,或者闭包函数,本质是一种函数,可以在函数运行以后,依然存在自由变量(或者说可用变量),可以对闭包的数据进行隐藏,避免使用全局变量
如上边 hello中的变量 s一样,在第一次执行h = hello的时候,隐藏了s,此时s为自由变量,依然存在,可以继续使用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。