函数的定义与调用
s="csaicja ics" def my_len(): i=0 for k in s: i+=1 print(i) length=my_len() print(length)#函数定义了之后可以再任何地方调用#没有返回值,只是单纯的打印
返回的重要性
len()是内置函数
def my_len():
i=0
for k in s:
i+=1
print(i) 是自定义函数
len()的缺点:
#不能变,只是计算s字符串的长度
#只是输出了结果
s="csaicja ics" def my_len(): i=0 for k in s: i+=1 print(i) return i length=my_len() print(length)
#返回值的三种情况
#没有返回值
1.不写return
2.只写return:结束一个函数的继续
3.return None——不常用
def func(): l=["haha","hehe"] for i in l : print(i) if i =="haha": return 跳出整个函数,不打印(“=”*10)
print("="*10)
ret=func() print(ret)
def func(): l=["haha","hehe"] for i in l : print(i) if i =="haha": break 只是跳出“break”以下的部分,继续打印(“=”*10) print("="*10) ret=func() print(ret)
def func(): l=["haha","hehe"] for i in l : print(i) if i =="haha": return None print("="*10) ret=func() print(ret)
#返回一个值
1.可以返回任何数据类型
2.只要返回就可以接收到
3.如果在一个程序里有多个return,那么只执行第一个
def func(): return {"k":"v"} print(func())
def func(): return {"k":"v"} return [1,2,3] print(func()) 输出结果{"k":"v"}
#多个返回值def func2(): return 1,2 r1,r2=func2() print(r1,r2) 输出结果 1 2
def func2(): return 1,2 r1,r2,r3=func2() 错误 print(r1,r2)
def func2(): return 1,2 r=func2() print(r) 输出结果(1,2)
def func2(): return (1,2,3) r=func2() print(r) 输出结果(1,2,3)
#返回多个值
1.多个返回值用多个变量接收:有多少返回值就用多少变量接收
2.用一个变量接收,得到的是一个元组
s="csaicja ics" def my_len(s): #接收参数,形式参数 i=0 for k in s: i+=1 print(i) return i #返回值 length=my_len(s) #传递参数,实际参数 print(length)
#形参与实参的概念
def f1(l1): for i in l1: print(i) def f2(l2): for i in l2: print(i) f1([1,2,3,4,5]) f2([6,7,8,9,10])
def f1(l1): 1 for i in l1: 5 print(i) 6 def f2(l1): 2 f1(l1) 4 for i in l1: 7 print(i) 8 f2([6,7,8,9,10]) 3
def f2(l1): 1 f1(l1) 4 for i in l1: 7 print(i) 8 def f1(l1): 2 for i in l1: 5 print(i) 6 f2([6,7,8,9,10]) 3
def f2(l1): f1(l1) for i in l1: print(i) f2([6,7,8,9,10]) 错误(f2函数接收到参数,不会再往下走,f1只是调用函数,但没有定义) def f1(l1): for i in l1: print(i)
def my_sum(a,b): res=a+b return res #result ret=my_sum(1,2) print(ret)
def my_sum(a,b): print(a,b) 1 2 res=a+b return res ret=my_sum(b=2,a=1) print(ret) 输出结果 3
def my_sum(a,b): print(a,b) 2 1 res=a+b return res ret=my_sum(1,a=2) 错误 print(ret)
#站在实参的角度上:
#按照位置传参
#按照关键字传参
#混着用可以,但是必须是位置参数在前,关键字参数在后
#不能给同一个变量传多个值
def my_sum(a,b): res=a+b return res ret=my_sum(a=1,2) 错误 print(ret)
def my_sum(a,b): res=a+b return res ret=my_sum(1,2,3) 错误 print(ret)
def classmate(name,sex="男"): print('{}:{}'.format(name,sex)) classmate("大熊","男") classmate("小静","女") classmate("胖虎","男") classmate("小夫","女") 输出 小夫:女 不受定义参数控制
#只有调用函数的时候
#按照位置传:直接写参数的值
#按照关键字:关键字=值
#定义函数的时候:
#位置参数:直接定义参数
#默认参数,关键字参数:参数值=“默认的值”
def classmate(sex="男",name): 错误,关键字参数不能在前 print('{}:{}'.format(name,sex)) classmate("大熊","男") classmate("小静","女") classmate("胖虎","男") classmate("小夫",sex="女") 不能都赋给一个参数
定义,传递多个位置参数
def my_sum(*args): print(args) n=0 for i in args: n+=i return n ret=my_sum(1,2,3,4,5) print(ret) 输出结果 15
#动态参数有两种:可以接收任意个参数
#参数名前加*,习惯参数名args,可以变,但必须加*
#参数名前加**,习惯参数名kwargs,可以变,但必须加**
#*args:接收的是按照位置传参的值,组织成一个元组
#**kwargs:接收的是按照关键字传参的值,组织成一个字典
#*args必须在**kwargs之前
#顺序:位置参数,*args,默认参数**kwargs
def func(*args,l=[]): print(args,l) 输出结果 (1,2,“str”,[1,2,3])[] func(1,2,"str",[1,2,3])func(1,2,"str",l=[1,2,3]) (1, 2, 'str') [1, 2, 3]
def func(**kwargs): print(kwargs) func(a=1,b=2,c=3)
def func(*args,**kwargs): print(args,kwargs) 输出结果 (1,2,3,“str”){“a”:1,“b”:2} func(1,2,3,"str",a=1,b=2)
def func(*args): print(args) func(1,2,3,4,5) 第一种写法 l=[1,2,3,4,5] 第二种写法 func(*l)
def func(**kwargs): 站在形参的角度上,给变量加上**,就是组合所有传来的值 print(kwargs) func(a=1,b=2) 第一种写法 dic={"a":1,"b":2} 第二种写法,定义一个字典 func(**dic) 站在实参的角度上,给一个序列加上**,就是把这个序列按照顺序打散
#函数的注释
'''
这个函数实现了什么功能
参数1:
参数2:
return:是字符串或列表的长度
'''
#函数的参数
#形参:
#位置参数:必须传
#*args:可以接收任意多个位置参数
#默认参数:可以不传
**kwargs:可以接收多个关键字参数
#实参:按照位置传参,按照关键字传参
#函数名() #不接收返回值
#返回值=函数名()#接收返回值
#返回值
#没有返回值,默认返回 None
#不写return:函数内的代码执行完毕自动结束
#只写return,结束一个函数
#return None
#返回一个值:结束了一个函数且返回一个值,可以是任意值
#返回多个值:多个值之间用逗号隔开,接收的时候可以用一个变量接收(元组),也可以用等量的多个变量接收
#默认参数的陷阱
def func(l=[]): l.append(1) print(l) func() [1] func() [1,1] func() [1,1,1]
#如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不传值就公用这个数据类型的资源
def func(l={}): l["k"]="v" print(l) func() {“k”:“v”} func() {“k”:“v”} 无键添加,有键覆盖 func() {“k”:“v”}
def func(k,l={}): l[k]="v" print(l) func(1) func(2) func(3)
{1: 'v'}
{1: 'v', 2: 'v'}
{1: 'v', 2: 'v', 3: 'v'}
#命名空间和作用域
print()
input()
list
tuple
#内置命名空间————python解释器
#就是python解释器一启动就可以使用的名字存储在内置命名空间里·
#内置的名字在启动解释器的时候被加载进内存里
#全局命名空间————我们写的代码但不是函数中的代码
#是在程序从上到下被执行的过程中依次加载进内存里
#放置了我们设置的所有的变量名和函数名
#局部命名空间————函数
#就是函数内部定义的名字
#当调用函数的时候才会产生这个名称空间,随着函数执行的结束,这个命名空间就消失了
#在局部:可以使用全局.内置命名空间里的名字
#在全局:可以使用内置命名空间里的名字,但不可以使用局部
def func()
a=1
func()
print(a) 错误 内置不能使用局部
def max(l): print("in max func") print(max([1,2,3])) #没有返回值
in max func
None
#正常情况下,直接使用内置的名字
#当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
#当我自己有的时候,我就不找我的上级要了
#如果我自己没有,就找上级要
#如果上一级也没有,就报错
def input(): print("in max func") def func(): input() func()
in max func
def input(): print("in max func") def func(): input=1 print(input) func()
1
func——>函数的内存地址
#函数名()函数的调用
||
||
#函数的内存地址()函数的调用
print(func)
def func1():
a=1
def func2():
print(a) 错误,不用调用
#多个函数应该拥有多个独立的局部名字空间,不互相共享
#作用域,两种
#全局作用域——作用在全局——内置和全局名字空间中的名字都属于全局作用域
#局部作用域——作用在局部——函数(局部名字空间里的名字只属于局部作用域)
a=1
def func()
a+=1 错误
#对于不可变数据类型,在局部可以查看全局作用域中的变量,但是不可以修改,如果想要修改,需要在程序的一开始添加global声明
a=1
def func()
global a
a+=1
func()
print(a) 2
a=1 b=2 def func(): x="aaa" y="bbb" print(locals()) 本地的 func() print(globals())
{'x': 'aaa', 'y': 'bbb'}
{'a': 1, 'b': 2}
#如果在一个局部函数内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
#globals永远打印全局的名字
#locals输出什么,根据locals所在的位置
a=1 def func(a): a=2 return a a=func(a) print(a)
2
def max(a,b): return a if a>b else bmax(1,2) 2 def the_max(a,b,c):函数的嵌套调用 d=max(a,b) return max(d,c) print(the_max(1,2,3))
3
#函数的嵌套定义
def outer()
a=1
def inner()
print(a) a
print("inner") inner
inner()
outer()
def outer(): a=1 def inner(): b=1 print(a) 1 print("inner") inner def inner2(): print(a,b) 1 1 print("inner2") inner2 inner2() inner() outer()
a=1 def outer(): a=3 def inner(): b=2 print(a) 3 print("inner") inner def inner2(): global a 声明了一个全局变量 a+=1 2=1+1 不可变数据类型的修改 print("inner2") inner2 inner2() inner() print("**a**",a) **a**,3 outer() print("全局",a) **全局**,2
#内部函数可以使用外部函数的变量
a=1 def outer(): b=3 def inner(): b=2 print(a) print("inner") def inner2(): nonlocal a a+=1 print("inner2") inner2() inner() print("**a**",a) outer() print("全局",a)
SyntaxError: no binding for nonlocal 'a' found
a=1 def outer(): a=3 def inner(): b=2 print(a) print("inner") def inner2(): nonlocal a a+=1 print("inner2") inner2() inner() print("**a**",a) outer() print("全局",a)
3
inner
inner2
**a** 4
全局 1
a=1 def outer(): a=3 def inner(): b=2 print(a) print("inner") def inner2(): nonlocal a a+=1 print("inner2") inner2() print("##a##",a) inner() print("**a**",a) outer() print("全局",a)
3
inner
inner2
##a## 4
**a** 4
全局 1
#nonlocal 只能用于局部变量,找上层中距离当前函数最近一层的局部变量
#声明了nonlocal的内部函数的变量修改会影响到离当前函数最近的一层的局部变量
#对全局无效
#对局部也只是对最近的一层有影响
def func()
print(123)
#func()#函数名就是内存地址
func2=func #函数名可以赋值
func2()
l=[func,func2] #函数名可以作为容器类型的元素
print(l) [<function func at 0x02C194B0>, <function func at 0x02C194B0>]内存地址
for i in l:
i()
def func(): print(123) #func2=func #l=[func,func2] #print(l) def haha(f): f() haha(func) #函数名可以作为函数的参数
def func(): print(123) #func2=func #l=[func,func2] #print(l) def haha(f): f() return f #函数名可以作为函数的返回值 hehe=haha(func) hehe()
123
123
#闭包:嵌套函数,内部函数调用外部函数的变量
def outer(): a=1 def inner(): print(a) inner() outer()
a = 1 def outer(): #a=1 def inner(): print(a) inner() 不是闭包 outer()
def outer(): a=1 def inner(): print(a) print(inner.__closure__) outer() print(outer.__closure__)
(<cell at 0x012FEBB0: int object at 0x569E6460>,)
None
a=1 def outer(): def inner(): print(a) print(inner.__closure__) outer() print(outer.__closure__)
None
None
def outer(): a = 1 def inner(): print(1) print(inner.__closure__) outer() print(outer.__closure__)
None
None
def outer(): a=1 def inner(): print(a) return inner inn=outer() inn()
a=10 b=20 def tt5(a,b): a=3 b=5 print(a,b) c=tt5(b,a) print(c)
3 5
None
#三元运算
a=1
b=2
c=a if a>b else b
print(c)
变量=条件返回True的结果 if 条件 else 条件返回else的结果
#必须要有结果
#必须有if和else
#只能是简单的情况
###每一个函数 都应只负责一项具体的工作,这样优于使用一个函数来完成两项工作。编写函数时,如果发现它执行的任务太多,请尝试将这些代码划分到多个函数里。别忘了,总是可以在一个函数里调用另一个函数,这有助于将复杂的任务划分成一系列的步骤。
来源:https://www.cnblogs.com/qwer-123/p/11196268.html