2、函数和函数名
函数名就是一个变量,这个变量只不过代指的函数而已
name = 'feige'
def add(n1,n2):
return n1+n2
*** 函数必须先定义,才能被调用执行
# 正确的方式
def add(n1,n2):
return n1+n2
ret = add(1,2)
print(ret)
# 错误的方式
ret = add(1,2)
print(ret)
def add(n1,n2):
return n1+n2
2.1 函数做元素
既然函数就相当于是一个变量,那再列表等元素中是否可以把行数当作元素呢
def func():
return 123
data_list = ['feige','func',func,func()]
print(data_list[0]) ## 字符串 'feige'
print(data_list[1]) ## 字符串 'func'
print(data_list[2]) ## 函数 'func'
print(data_list[3]) ## 函数的执行结果 ’123‘
*** 函数同时是可以被哈希的,所以函数名同时也可以当作集合的元素,字典的健
def send_msg(mobile,content):
'''发生短信'''
pass
def send_email(to_email,subject,content):
'''发送图片'''
pass
func_list = [
{'name':send_msg,'params':{'mobile':'15131255089','content':'你有新短消息'}},
{'name':send_email,'params':{'to_email':'feifei@live.com','subject':'报警消息','content':'硬盘容量不足'}},
]
for item in func_list:
func = item['name']
param_dict = item['params']
func(**param_dict) ## send_msg(**{'moblic':'15131255089','content':'你有新的短消息'})
2.2 函数名赋值
-
将函数名赋值给其他变量,相当于代指某个函数,如果函数名赋值给另外一个变量,则此变量也会代指该函数,例如:
def func(a1,a2): return a1+a2 abc = func func(1,2) abc(1,2)
-
对函数名重新赋值,如果函数名修改为其他值,函数名便不再代指函数,比如说:
def func(a1,a2): return a1+a2 # 执行func函数 func(11,22) # func 重新赋值成一个字符串 func = '新的值' print(func) # 字符串 新的值
*** 由于函数名被重新定义之后,就会被定义为新的值,所以自定义函数时,不要和python内置的函数名同名,否则会覆盖原有内置函数的功能
2.3 函数名做参数和返回值
-
参数
def plus(num): return num + 100 def hadler(func): res = func(10) msg = '执行func,并获取到结果为:{}'.format(res) print(msg) # 执hadler的函数,将plus作为参数传递给handler的形参func hadler(plus)
3、返回值和print
这两个时完全不同的
-
函数中使用print,只是用于在某个位置输出内容而已
-
函数中使用return,时为了将函数的执行结果返回给调用者,以便于后续的其他操作
4、 作用域
可以理解时一个空间,空间的数据可以共享,
4.1 函数为作用域
-
python 以函数为作用域,函数内的数据,其他函数无法使用
def func(): name = 'fiege' print(name) age = 20 print(age) def handler(): age = 18 print(age) func() handler()
4.3 global 关键字
-
默认情况下,局部作用域对全局变量只能进行:读取和修改可变类型的内部元素,无法对全局变量进行重新赋值
-
如果想要在局部作用域中对全局变量重新赋值,则可以基于global 关键字实现
eg:
COUNTRY = [china] CITY_LIST = [11,22,33] def download(): url = 'www.xxx.com' global CITY_LIST = [22,33,44] print(CITY_LIST) download() ## print输出的是 22,33,44