一、动态传参

  动态接受位置参数:  *参数名

def eat(*food):
print(food) #多个参数传递进去,收到的内容是元祖tuple
eat("盖浇饭", "麻辣烫", "冰封") #('盖浇饭', '麻辣烫', '冰封')

  动态接收参数的时候要注意,动态参数必须在位置参数后面

  错误事例:

# def eat(*food, a, b):
# print(food, a, b)
# eat("盖浇饭", "麻辣烫", "冰封") #程序会报错,因为传递进去的位置参数都被*food接收了,a和b永远接收不到参数

  正确事例:

# def eat(a, b, *food):
# print(a, b, food)
# eat("盖浇饭", "麻辣烫", "冰封") #盖浇饭 麻辣烫 ('冰封',) #前两个参数用位置参数接收,后面的参数用动态参数接收
默认值参数写在动态参数前面,默认值只有一种情况可能会生效
# def eat(a, b, c='馒头', *food):
# print(a, b, c, food)
# eat("盖浇饭", "麻辣烫") #盖浇饭 麻辣烫 馒头 () 默认值生效
# eat("盖浇饭", "麻辣烫", "冰封") #盖浇饭 麻辣烫 冰封 ()
# eat("盖浇饭", "麻辣烫", "冰封", "烧烤") #盖浇饭 麻辣烫 冰封 (‘烧烤’,)

  默认值参数写在动态参数后面,所有的默认值都生效

# def eat(a, b, *food, c='馒头'):
# print(a, b, food, c)
# eat("盖浇饭", "麻辣烫") #盖浇饭 麻辣烫 () 馒头 默认值生效
# eat("盖浇饭", "麻辣烫", "冰封") #盖浇饭 麻辣烫 ('冰封',) 馒头 默认值生效
# eat("盖浇饭", "麻辣烫", "冰封", "烧烤") #盖浇饭 麻辣烫 ('冰封', '烧烤') 馒头 默认值生效

  动态参数接收关键字参数: **参数名

# def eat(**food):  #  **关键字参数
# print(food) 'good_food': '盖浇饭', 'junk_food': '麻辣烫', 'drink': '脉动'}
# eat(good_food='盖浇饭', junk_food="麻辣烫", drink="脉动") 参数传递进去,收到的内容是字典dict

  关键字参数必须要在位置参数后面,否则报错

def func(a, b, c, d):
print(a, b, c, d)
func(1, 2, c=3, 4) #报错

  最终顺序:位置参数 > *args > 默认值参数 > **kwargs

  接收所有的参数

# def func(*args, **kwargs):
# print(args, kwargs)
# func(1, 4, a=8, b = 9, c= 10) (1, 4) {'a': 8, 'b': 9, 'c': 10}

  动态参数的另一种传参方式

# def eat(*fruit):    # 聚合成元组
# print(fruit)
# lst = ["香蕉", "茄子", "黄瓜", "辣椒", "大白梨"]
# eat(lst[0], lst[1], lst[2], lst[3], lst[4]) ('香蕉', '茄子', '黄瓜', '辣椒', '大白梨')
# eat(*lst) # 这里的*表示的是把lst打散 ('香蕉', '茄子', '黄瓜', '辣椒', '大白梨')
def fun(*args):
print(args)
s = '臣妾做不到'(可迭代对象)
fun(*s) #('臣', '妾', '做', '不', '到') 以最小单元为元素,输出元祖

  字典打散,聚合,还是字典

def fun(**kwargs):
print(kwargs)
dic = {'a':1,'b':2}
fun(**dic) #{'a': 1, 'b': 2}

二、命名空间

  命名空间一共分为三种:

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

    局部命名空间:在函数中声明的变量会放在局部命名空间

    内置命名空间:存放了python解释器为我们提供的名字:input,print,str,list,tuple..都是内置命名空间

三种命名空间之间的加载与取值顺序:

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值顺序:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

作用域:作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围内生效

a = 10  # 全局
def func(): # 全局
a = 40 # 局部
b = 20 # 局部
func() # 全局
 # print(globals()) # 打印全局作用域中的内容
# print(locals()) # 打印局部作用域中的内容

三、函数嵌套

    目前为止,所有的()表示的就是函数的调用

def f1():
  print(111)
  def f2():
  print(222)
f2()
f1() #111 222

四、global和nonlocal

    global: 寻找全局作用域中的内容
    nonlocal: 寻找上一级作用域中的内容, 但不能是全局的

# a = 10
# def func():
# global a # 加了个global表示不在局部创建这个变量,直接使用全局的a
# a = 20
# print(a)
# func()
# print(a)
a = 10
def func1():
a = 20
print(a)
def fun2():
nonlocal a # 调用上一级的变量, 且不能是全局
a = 30
print(a)
fun2()
print(a)
func1()
print(a)

动态传参,命名空间,嵌套,gloabal,nonlocal的更多相关文章

  1. 函数动态传参,命名空间,gloabal,nonlocal关键字

    一.函数参数->动态传参(形参的第三种) 动态参数分为两种: 1)动态接收位置参数 普通的位置传参: def func(quality_food,junk_food): print('我要吃', ...

  2. python记录_day10 动态传参 命名空间 作用域

    一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...

  3. python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)

    一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮&q ...

  4. python-函数-动态传参,作用域的问题,函数嵌套,global nonlocal

    ⼀. 函数参数--动态传参 之前我们说过了传参, 如果我们需要给⼀个函数传参, ⽽参数⼜是不确定的. 或者我给⼀个 函数传很多参数, 我的形参就要写很多, 很⿇烦, 怎么办呢. 我们可以考虑使⽤动态参 ...

  5. python之路--动态传参,作用域,函数嵌套

    一 . 动态传参(重点)  * ,  ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...

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

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

  7. python-函数进阶-动态传参,名称空间,作用域的问题

    一.函数的动态的动态参数 动态参数分为两种:动态接收位置参数.动态接收关键字参数. 1.*args  位置参数动态传参 # 顺序: 位置参数=>*args(arguments) => 默认 ...

  8. 2018.8.9 python中的动态传参与命名空间

    主要内容: 1.函数参数 ----动态传参 2.名称空间与作用域 3.函数的嵌套 4.global,nonlocal关键字 一.函数参数 ------动态传参 形参的第三种:动态传参 动态传参分为两种 ...

  9. js函数动态传参

    js函数体内可以通过arguments对象来接收传递进来的参数,利用这一对象属性可以动态传参. function box() { return arguments[0]+' | '+arguments ...

随机推荐

  1. [leetcode]669. Trim a Binary Search Tree寻找范围内的二叉搜索树

    根据BST的特点,如果小于L就判断右子树,如果大于R就判断左子树 递归地建立树 public TreeNode trimBST(TreeNode root, int L, int R) { if (r ...

  2. react状态管理器之mobx

    react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...

  3. Spring boot 启动错误处理:Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular...

    错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoconfigure.jdb ...

  4. YourBatman 2020年感悟关键词:科比、裁员、管理层、活着

    目录 本文提纲 ✍前言 版本约定 ✍正文 科比 裁员 如何避免被裁? 1.不要迷恋管理,一味追求"当官" 2.别以为裁员只裁一线,不裁管理层 3.即使步入管理,建议不要脱离技术 4 ...

  5. 已加载"C:\Windows\SysWOW64\msvcp120d.dll".无法查找或打开 PDB 文件.

    已加载"C:\Windows\SysWOW64\msvcp120d.dll".无法查找或打开 PDB 文件. 今天使用vs2013遇到了这样的问题. 解决方案: 点调试. 然后选项 ...

  6. Kali实现靶机远程控制

    任务一.使用netcat建立监听并连接 1.          在ubuntu开启本地监听,在kali中连接 2.          在kali中开启监听,在ubuntu中反弹连接 任务二.使用met ...

  7. (class: org/apache/jasper/runtime/PageContextImpl, method: getELResolver signature: ()Ljavax/el/ELResolver;) Incompatible argument to

    网上大多都说是jsp版本原因: 引用: .............................................. ................................. ...

  8. 第十九章节 BJROBOT 安卓手机 APP 导航【ROS全开源阿克曼转向智能网联无人驾驶车】

    导航前说明:一定要确保你小车在构建好地图的基础上进行! 1.把小车平放在你想要构建地图区域的地板上,打开资料里的虚拟机,打开一个终端, ssh 过去主控端启动roslaunch znjrobot br ...

  9. sql操作数据库(2)--->DQL、数据库备份和还原

    查询 查询表中的所有的行和列的数据 ​ select * from 表名; ​ select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...

  10. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (II)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架 II第二部 0. 本系列教程 1. 登录功能准备 a.python中操控mysql b. 安装数据库 c.安装mys ...