*** 坚持坚持,即使你不太强***

1.函数的动态传参

2.函数的命名空间及作用域

3.函数嵌套

4.global和nonlocal关键字

一.函数的动态传参

1. *args: 位置参数动态传参,  *号在这里表示接收位置参数的动态传参,接收的是元组.

例:

  1. def chi(*food): #参数名是food *表示动态传参
  2. print(food)
  3. chi("大米饭","龙虾面","馒头")
  4. chi("馒头","盖浇饭")
  5. chi()
  6.  
  7. # ('大米饭', '龙虾面', '馒头')
  8. ('馒头', '盖浇饭')
  9. ()

例:

  1. def chi(name,*food,location = "北京"): #默认值参数需要放到后面
  2. print(location)
  3. print(name + "要吃",food)
  4. chi("李启政","盖浇饭","火腿肠","大米饭",)
  5. # 北京
  6. 李启政要吃 ('盖浇饭', '火腿肠', '大米饭')

默认值参数放在位置参数动态传参前面之前只有一种情况可能会生效,那就是没有动态参数时;如果位置排序如上图,这个时候如果不给出关键字传参. 那么你的默认值是永远都生效的.

例:

  1. def chi(a, b, c='馒头', *food):
  2. print(a, b, c, food)
  3. chi("大米饭","盖浇饭") #'大米饭','盖浇饭','馒头',() 默认值生效
  4. chi("大米饭","盖浇饭","火腿肠","猪蹄") # '大米饭', '盖浇饭', '火腿肠','猪蹄' 默认值不生效

注: 动态接收参数的时候要注意, 动态参数必须在位置参数后面,不然程序会报错,后面的位置参数永远接收不到参数.想要解决报错问题,就要

 把后面的位置参数改为关键字参数.

例:

  1. def chi(*food, a, b):
  2. print("我要吃", food, a, b)
  3. chi("大米饭","盖浇饭","火腿肠","猪蹄")
  4.  
  5. #Traceback (most recent call last):
  6. File "/Users/sylar/PycharmProjects/oldboy/fun.py", line 95, in <module>
  7. chi("大米饭","盖浇饭","火腿肠","猪蹄")
  8. TypeError: chi() missing 2 required keyword-only arguments: 'a' and 'b'

改:

  1. def chi(*food, a, b):
  2. print("我要吃", food, a, b)
  3. chi("大米饭","盖浇饭",a = "火腿肠",b = "猪蹄") # 必须用关键字参数来指定

所以,顺序为: 位置参数 =>  *args(位置参数动态参数) => 默认值参数

2. **kwargs : 关键字参数动态传参 ,接收关键字参数的动态传参.接收的是字典.

在python中使用 **kwargs 来表示接收关键字动态参数

例:

  1. def func(**kwargs):
  2. print(kwargs)
  3. func(a=1, b=2, c=3)
  4. func(a=1, b=2)
  5. # 接收的是一个字典
  6. {'a': 1, 'b': 2, 'c': 3}
  7. {'a': 1, 'b': 2}

顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.所以关键字参数必须在位置参数后面. 由于实参是这个顺序. 所以形参接收的时候也是这个顺序. 也就是说位置参数必须在关键字参数前面. 动态接收关键字参数也要在后面.

例:

def func(a, b, c, d): print(a, b, c, d) # 关键字参数必须在位置参数后面, 否则参数会混乱 func(1, 2, c=3, 4)

如果想接收所有的参数:

*args , **kwargs       #无敌传参

  1. def chi(*food2, **food): # 无敌传参
  2. print(food)
  3.  
  4. chi("狗不理", "汉堡",drink="大白梨",ice_cream="哈根达斯")

def fun(a, *args, c="哈哈", **kwargs): print(a, args, c, kwargs)

所以,最终顺序为: 位置参数 =>  *args => 默认值参数 => **kwargs

3.函数的注释:

  1. def chi(food, drink):
  2. """
  3. 这里是函数的注释, 先写一下当前这个函数是是什么的, 比如我这个函数就是一个吃
  4. :param :param food: 参数food是什么意思 #第一个数据
  5. :param :param drink: 参数drink是什么意思 #第二个数据
  6. :return :return: 返回的是什么东东
  7. print(food, drink)
  8. return "very good"

4.形参和实参的聚合与打散:

  1. 形参: 聚合
  2. def func(*food): # 聚合, 位置参数
  3. print(food)
  4. lst = ["鸡蛋","煎饼果子","猪蹄","滋滋冒油"]
  5. 实参: 打散
  6. func(*lst) # 打散. 把list, tuple, set, str 进行迭代打散
  1. 聚合成关键字参数
  2. def func(**kwargs):
  3. print(kwargs)
  4.  
  5. dic = {"name":'alex', 'age':''}
  6. func(**dic) # 打散成关键字参数

二.函数的命名空间及作用域

1.命名空间

在python解释器开始执行之后, 就会在内存中开辟一个空间,我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量在存储的时候就是存储在这片空间中的.

命名空间分类: 1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

        2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

       3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

  1. a = 10 # 全局名称空间中的内容
  2.  
  3. def fn(): # fn也在全局名称空间
  4. b = 20 # 局部名称空间
  5. print(a)
  6. def gn():
  7. print(a)
  8. fn()
  9. gn()

取值顺序: 1. 局部命名空间 2. 全局命名空间 3. 内置命名空间

2.作用域:

作用域: 作用域就是作用范围, 按照生效范围来看分为 全局作用域和局部作用域.

(1)全局作用域:包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循从上到下逐层执行.).

(2)局部作用域:在函数内部可以使用.

同时,我们可以通过globals()函数来查看全局作用域中的内容, 也可以通过locals()来查看局部作用域中的变量和函数信息.

例:

  1. 1. 内置, 2. 全局 , 3. 局部(函数调用)
  2. a = 110 # 全局
  3. def fn(): #
  4. b = 20 # 局部
  5. def gn(): # 局部
  6. print(globals()) # 可以查看全局作用域中的内容
  7. print(locals()) # 查看当前作用域中的内容
  8. gn()
  9. fn()

三. 函数的嵌套

1. 只要遇见了()就是函数的调用. 如果没有()就不是函数的调用

2. 函数的执行顺序

  1. def outer():
  2. print("哈哈")
  3. def inner_1():
  4. print("呵呵")
  5. def inner_1_1():
  6. print("嘻嘻")
  7. inner_1_1()
  8. print("吼吼")
  9. def inner_2():
  10. print("嘿嘿")
  11. inner_2()
  12. inner_1()
  13. outer()

四.global 和 nonlocal 关键字

(1) global: 在局部访问全局中的内容

例:

  1. a = 10 # 全局变量本身就是不安全的, 不能随意修改
  2. def func():
  3. global a # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
  4. a = 20
  5. a += 10 # a = a+10
  6. print(a)

(2) nonlocal: 在局部寻找外层函数中离他最近的那个变量

例:

  1. a = 10 #全局变量
  2. def func1():
  3. a = 20
  4. def func2(): #在func中改变a的值
  5. nonlocal a #寻找外层中离他最近的那个变量
  6. a = 30
  7. print(a)
  8. func2()
  9. print(a)

例:

  1. a = 1
  2. def fun_1():
  3. a = 2
  4. def fun_2():
  5. global a
  6. a = 3
  7. def fun_3():
  8. a = 4
  9. print(a)
  10. print(a)
  11. fun_3()
  12. print(a)
  13. print(a)
  14. fun_2()
  15. print(a)
  16. print(a)
  17. fun_1()
  18. print(a)

  1.  

python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)的更多相关文章

  1. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)

    一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...

  2. 【学习笔记】--- 老男孩学Python,day10, 函数, 动态参数 命名空间\作用域 global nonlocal

    1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序:位置---*args---默认值---**kwargs 在形参上*聚合, **聚合 在实参上*打散, ...

  3. python函数的动态传参.作用域与命名空间

    一.动态传参1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参 def chi(*food): print(food) chi() # 动态传参可以不传参数 chi ...

  4. 百万年薪python之路 -- 函数的动态参数

    1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...

  5. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  6. 百万年薪python之路 -- 函数的动态参数练习

    1.继续整理函数相关知识点. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*args,**kwargs): num_sum = 0 num_dic = [] num ...

  7. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  8. 自学python day 10 函数的动态参数、命名空间、作用域

    作业提升: s为字符串 s.isalnum() 所有字符都是字母或者数字 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符否是数字 2. for i in range(1,1 ...

  9. 函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)

    1. 函数参数--动态传参 昨天已经解过了传参, 如果需要给一个函数传参,而参数又是不确定的. 或者我们给一个函数传很多参数, 我的形参就要写很多, 写起来就很麻烦, 这时我们可以考虑使用动态参数.形 ...

随机推荐

  1. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

  2. py库: scrapy (深坑未填)

    scrapy 一个快速高级的屏幕爬取及网页采集框架 http://scrapy.org/ 官网 https://docs.scrapy.org/en/latest/ Scrapy1.4文档 http: ...

  3. 使用Quartz框架定时发送预警邮件

    1.  Quartz定时发送预警邮件 1.1.   需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2.   Quartz框架 Quartz是OpenSymph ...

  4. 白鹭引擎 - 碰撞检测 ( hitTestPoint )

    1, 矩形碰撞检测 class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须 ...

  5. THML DOM / Element 对象操作

    随着Vue等MVVM框架流行,操作DOM已经不想之前那么频繁,因此很多DOM的操作已经陌生,特此回顾HTML中DOM操作 获取Element节点 熟悉的有 通过ID获取,返回element对象    ...

  6. springboot 多环境选择

    1.配置开发环境(开发环境) 2. application.yml  环境选择 3.cmd  切换环境 4. 设置环境调用方法 5. 另一方法

  7. 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)

    1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个ker ...

  8. li直接1px 像素的原因

    1.由于空白节点(多由于Enter造成),li不换行就可以解决问题. Internet Explorer会忽略节点之间生成的空白节点,其它浏览器不会忽略(可以通过检测节点类型,过滤子节点) 2.完美解 ...

  9. C# 容器重用避免GC 的论证

    var lst = new List<int>(); lst.Capacity = ; var cnt = lst.Count; var cp = lst.Capacity; ; i< ...

  10. 今天学习到的几条shell技巧

    1.获取某个进程的进程号 PID=`ps aux | grep 进程名 | grep -v "grep" | awk '{print $2}'` 2.获取某个进程的CPU(同理可获 ...