python 函数部分

函数

def fun(形参):  定义函数
fun(实参)             执行函数
return           函数的返回值,遇到return不执行下面的代码,无return和直接写return返回的是None,返回值有多个时会放到元组里
'''
函数的注释  标明函数的作用以及每个值得意义  使用 函数名.__doc__ 即可查询该函数得注释值
'''
函数名  就是变量的功能加上()就能执行(也叫第一对象)
1、可以相互赋值
def fun()
    print('123qwe')
f = fun
f()
2、可以当成函数的参数
def fun():
    print('123')
def fun2(argc):
    argc()
    print('111')
fun2(fun)
3、可以当成容器类数据的参数
def fun():
    print('123')
def fun2():
    print('111')
def fun3():
    print('3333333')
list1 = [fun, fun2, fun3]
for i in list1:
    i()
4、可以当成函数的返回值
def fun():
    print('123')
def fun2(argv):         
    print('111')
    return argv          #函数作为返回值
f = fun2(fun)           #将函数名作为参数
f()
说明:此时的argv就是fun就是f       f()实际上执行的是fun()  所以输出为:111     123
函数的传参
从实参角度传参顺序: 位置参数=》关键字参数
def func1(x, y, z):
    print(x, y, z)
func1(1, 2, 3)             #位置参数 必须一一对应
func1(x=1, y=2, z=3) #关键字参数可不分顺序
返回大数 三元运算符

def compare(a, b):
    return a if a > b else b    
或
print(a if a > b else b)
混合参数, 关键字参数必须在位置参数的后面。

def fun(argv1, argv2, argv3):
    print(argv1)
    print(argv2)
    print(argv3)
fun(1, 2, argv3=3)      #混合参数中位置参数一一对应,关键字参数必须在位置参数最后
从形参角度传参顺序:  位置参数=》*args=》默认参数=》**kwargs
1、位置参数 与实参角度一样,必须一一对应,位置参数必须传值
2、默认参数   默认参数必须在位置参数后面, 默认参数是个可变数据类型

当函数中有默认参数,那么实参使用默认的,如果写就覆盖默认参数。使用方法为sex = 'hhhh'(关键字传参法)
def register(name, sex=''):
    with open('register.txt', encoding='utf-8',mode='a') as fd:
        fd.write('{},{}
'.format(name, sex))
while True:
    print('q exit')
    name = input('name=')
    sex = input('sex=')
    if name.upper() == 'Q':break
    register(name)                                # 不传实参时 形参会自动使用默认参数
--------------------------------
def default_param(a, l = [])        # 默认参数是可变数据类型
    l.append(a)
    print(l)
default_param('hello')
default_param('world')
动态参数:fun(*args, **kwargs)万能参实
当函数的传的参数不定时使用。*args接收的是位置参数,包括空值也不会报错,并存放到元组。     **kwargs接收的是关键字参数,并存放到字典
def fun(*args, **kwargs):
    print(args)                      #输出类型为元组(针对所有位置参数)
    print(kwargs)                  #输出字典
fun(1, 2, 3, 4, 5, 6, 7,'alex', '老男孩', a='w', b='q', c='323')
输出:
(1, 2, 3, 4, 5, 6, 7, 'alex', '老男孩')
{'a': 'w', 'b': 'q', 'c': '323'}
打散、聚合功能,*将形参无论什么格式以单个元素放入元组中。 **将形参聚合到字典中  (不会看这个)
def fun(*args, **kwargs):                                      #形参加*表示将传参聚合并放入一个元组中, 加**表示聚合到字典中
    print(args)
    print(kwargs)
list1 = [1, 2, 3, 4]
tupe1 = (1, 2, 3, 4)
list2 = ['alex', 'wuser', 4]
dic = {'qq':1, 'er':'wwe'}
fun(list1, *tupe1, *list2, cc = 4, **dic)                     #实参加 * 表示将位置参数迭代打散传入,作用域为 str tuple set  list     ** 表示将字典和关键字参数传入

输出:
([1, 2, 3, 4], 1, 2, 3, 4, 'alex', 'wuser', 4)
{'cc': 4, 'qq': 1, 'er': 'wwe'}
将dic 以*dic打散为实参传入 形参接受 到的是dic的key值
实参传入的字典key不能使用纯数字,因为传入的参数是当作变量使用的

python的名称空间  
全局名命空间   临时名称空间 内置名称空间
运行py代码时,遇到一个变量时python会开辟一段空间,存的是 变量和值的指针的关系,如name与alix的id的关系,当print(name)时,会先找name然后再找对应关系,找到对应指针后重内存中找到alix并打印。
遇到函数时只是将函数的名字记录到内存空间,其内部如何根本不关心,在函数调用时,python会开辟一段空间将记录函数内部的变量和对应值指针的关系记录,函数中的变量只能在函数内部使用,随着函数结束这块内存也会消失。
代码的开始 创建的存储‘变量与值的关系’的空间叫全局名命空间(全局名命空间);
在函数的运行中开辟的临时的空间叫做局部名命空间(临时名称空间)
系统函数的是  内置名称空间
加载顺序 :内置名称空间-》全局名称空间-》局部名称空间
取值顺序: 局部名称空间-》全局名称空间-》内置名称空间
作用域:
        全局作用域:全局名称空间 内置名称空间
        局部作用域:临时名称空间


关键字:   注意如果不调用该函数,即使使用了global和nonlocal修饰   也不会起作用
#global       在任何作用域  改变一个全局变量  ,如global 修饰的变量名不存在 相当于新建一个全局变量
name = 'hello'
def fun():
    global name     使用关键字后,调用函数后name变为全局变量
    name = 'abc'
fun()
print(name)
输出:  abc
#nonlocal   不能修改全局变量;只能在局部作用域中使用nonlocal,只改变当前作用域的变量,如过当前找不到就会像上层函数找,如果每层都找不到会报错。用的少 当py文件特别大时在嵌套过多时用

def fun():
    name = '123'
    print('qq%s'% name)
    def fun2():
        nonlocal name
        name = 'abc'
        print(name)
    fun2()
    print(name)
fun()
输出:
qq123
abc
abc
-----------------

a = 1
def fun_1():
    a = 2
    def fun_2():
        global a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)      输出:1 2 3 4 3 3 1
原文地址:https://www.cnblogs.com/Mr-wangxd/p/9449986.html