目录
1-3 参数形式 - range(len('hello'))
2-1 位置参数 - 实参和形参位置上一一对应,不可多值 、少值
2-2 关键词参数 - 形参实参指定变量名,以关键词辨认位置
2-3 默认形参 -设置默认值的关键词参数,传值时可省略传入过程,以默认值替代
2-4-3 将传给一个函数的参数 原封不动的传给另一个函数 -- *args + **kwargs
2-5 命名关键词参数 - *后定义的参数,必须被传值(有默认值的除外)
3-1 函数的嵌套调用 - 在调用一个函数过程中,其内部代码又调用了其他函数
3-2 函数的嵌套定义 - 一个函数内部又定义了另外一个函数
一、函数的三种形式
1-1 语句形式 - foo()
def foo() : print('a') return 1 foo()
1-2 表达式形式 - 3*len('hello')
def foo(): print('a') return 1 print(len(foo()))
1-3 参数形式 - range(len('hello'))
def foo1(a): print(a) return a def foo2(): print('a') return '123' print(foo1(foo2()))
二、 形参 and 实参
2-1 位置参数 - 实参和形参位置上一一对应,不可多值 、少值
def func1(x,y): print(x,y) func1(1,2)
2-2 关键词参数 - 形参实参指定变量名,以关键词辨认位置
注意:
- 实参传入时可结合位置参数 和 关键词参数 但格式只能为(位置参数,关键词参数),二者位置不可对调
- 实参不可对同一个值进行重复传值
def func1(name,age): print(name,age) func1('lin',age = 18) open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): open('a.txt','w',encoding='utf-8')
2-3 默认形参 -设置默认值的关键词参数,传值时可省略传入过程,以默认值替代
def func1(name,age,sex = 'male'): print(name,age,sex) func1('lin',age = 18) func1('lin',18,sex='female')
2-4 可变长参数 - 实参值的个数不固定
2-4-1 按位置的可变长参数 -- *args
def foo(x,y,*args): print(x,y) print(args) foo(1,2,3,4,5) # 在实参中带*:使其打散成位置实参进行赋值 def foo(x,y,*args): print(x,y) print(args) foo(1,2,*[3,4,5]) #== foo(1,2,3,4,5,6)
2-4-2 按关键词的可变长参数 -- **kwargs
def foo(x,y,z): print(x,y,z) foo(*[1,2,3])#== foo(1,2,3) def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,a=1,b=2,c=3) # 在实参中带**:使其打散成关键词实参进行赋值 def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,**{'a':1,'b':2,'c':3}) def foo(x,y,**z): print(x,y,z) foo(**{'z':1,'x':2,'y':3,'a':4})
2-4-3 将传给一个函数的参数 原封不动的传给另一个函数 -- *args + **kwargs
# 注:需要遵循foo 函数的规则 def foo(x,y): print(x,y) def wrapper(*args,**kwargs): print('====>') foo(*args,**kwargs) # wrapper(1,4) wrapper(1,y=777)
2-5 命名关键词参数 - *后定义的参数,必须被传值(有默认值的除外)
''' *后定义的参数,必须被传值(有默认值的除外), 且必须按照关键字实参的形式传递可以保证,传入的参数中一定包含某些关键字 ''' def foo(x,y,*args,a=1,b,**kwargs): print(x,y) print(args) print(a) print(b) print(kwargs) foo(1,2,3,4,5,b=3,c=4,d=5) ''' 结果: 1 2 (3, 4, 5) 1 3 {'c': 4, 'd': 5} '''
2-6 练习
2-6-1 函数当做另一个函数返回值返回
def func2(a): pass def func1(a): print(a) return a print(func1(func2(3)))
2-6-2 购物车功能优化选择
def login(): print('login') def register(): print('register') def shopping(): print('shopping') def pay(): print('pay') def transfer(): print('transfer') func_dic={ '1':login, '2':register, '3':shopping, '4':pay, '5':transfer } # print(func_dic) msg=""" 0 退出 1 登陆 2 注册 3 购物 4 支付 5 转账 """ while True: print(msg) choice=input('请输入您的操作: ').strip() if choice == '0':break if choice in func_dic: func_dic[choice]() else: print('输入错误指令,请重新输入')
三、函数的嵌套
3-1 函数的嵌套调用 - 在调用一个函数过程中,其内部代码又调用了其他函数
def bar(): print('from bar') def foo(): print('from foo') bar() foo() def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(1,2,3,4))
3-2 函数的嵌套定义 - 一个函数内部又定义了另外一个函数
def outter(): x=1 print('from outter') def inner(): print('from inner') # print(x) # print(inner) inner() # outter() # inner outter() def f1(): print('from f1') def f2(): print('from f2') def f3(): print('from f3') f3() f2() f1() from math import pi # print(pi) def circle(radius,action=0): """ 圆形相关运算 :param radius: 半径 :param action: 0代表求面积,1代表求周长 :return: 面积或者周长 """ def area(radius): return pi * (radius ** 2) def perimiter(radius): return 2 * pi * radius if action == 0: res=area(radius) elif action == 1: res=perimiter(radius) return res print(circle(10,0)) print(circle(10,1))
四、名称空间 - 内置、全局、局部
4-1 概念
''' 名称空间:存放名字的地方,存在三种名称空间。 #1、python解释器先启动,因而首先加载的是:内置名称空间 #2、执行test.py文件,然后以文件为基础,加载全局名称空间 #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间 - 问题:x=1,1存放于内存中,那名字x存放在哪里呢? 名称空间正是存放名字x与1绑定关系的地方 ''' # cmd 终端下 执行文件 -python test.py len=111 def foo(): len=222 print('站在局部找len: ',len) foo() print('站在全局找len: ',len)
4-2 查找顺序
# 名字的查找顺序,在函数定义阶段已经固定,与函数调用位置无关 # 即:无论在任何地方调用函数,都必须回到当初定义的函数位置进行查找局部或者全局变量 x = 111 def outer(): def inner(): print('from inner', x) # x访问的时全局名称空间中x return inner f = outer() # print(f) x = 222 f() ''' LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ locals 是函数内的名字空间,包括局部变量和形参 locals() 函数会以字典类型返回当前位置的全部局部变量。 enclosing 外部嵌套函数的名字空间(闭包中常见) globals 全局变量,函数定义所在模块的名字空间 global 在局部中声明来自全局作用域的变量名字,可以用来改变全局变量的值 builtins 内置模块的名字空间 nonlocal 函数声明一个名字是来自于当前外一层作用域的名字,用来修改外层函数的变量值 locals() >>>def runoob(arg): # 两个局部变量:arg、z ... z = 1 ... print (locals()) ... >>> runoob(4) {'z': 1, 'arg': 4} # 返回一个名字/值对的字典 >>> globals x=1 def foo(): x=2 foo() print(x) x=1 def foo(): global x x=2 foo() print(x) nonlocal 函数声明一个名字是来自于当前外一层作用域的名字,用来修改外层函数的变量值 ''' x = 0 def f1(): x = 111 def f2(): nonlocal x x = 222 f2() print(x) f1() print()