函数动态传参,命名空间,gloabal,nonlocal关键字
一.函数参数->动态传参(形参的第三种)
动态参数分为两种:
1)动态接收位置参数
普通的位置传参:
def func(quality_food,junk_food):
print('我要吃',quality_food,junk_food)
func('大米饭','小米饭') #大米饭传给quality_food 小米饭传给junk_food,按照位置有顺序的传
动态传参:*args 在参数位置编写*表示接收任意内容
def func(*food):
print('我要吃',food)
func('大米饭','小米饭')
结果:我要吃('大米饭','小米饭') 多个参数传进去,收到的内容是元祖tuple
注意:动态接收参数的时候,动态参数必须在位置参数后面
def func(a,b,*food)
print('我要吃',a,b,food)
func('大米饭','小米饭','馒头','面条')#前面的参数是用位置参数来接收,后面的参数使用动
态参数来接收
默认值参数:默认值参数写在动态参数的后面(在没有动态关键字传参的情况下)
顺序:位置参数-->动态参数(*)-->默认值参数
2)动态接收关键字参数 **kwargs
*args只能接收动态的位置参数,不能接收关键字参数.
**kwargs能接收动态的关键字参数但不能接收位置参数
def func(**kwargs):
print(kwargs)
func(a=1,b=2,c=3)
func(a=1,b=2)
结果:
{'a': 1, 'b': 2, 'c': 3} #接收的是一个dict
{'a': 1, 'b': 2}
最终顺序:
位置参数--->*args--->默认值参数--->**kwargs
接收所有的参数的写法:
def func(*args,**kwargs): #*表示聚合,所有的位置参数, 聚合成元组 **聚合成字典
print(args,kwargs)
func('a','b',c = '',d=10)
动态传参的另一种传参方式:
def func(*args): #
print(args)
lst = [1,2,3]
fun(lst[0],lst[1],lst[2])
#也可以写成:
fun(*lst) #可以使用*把一个列表按顺序打散
s = '你好么'
fun(*s)#字符串也可以打散(可迭代对象)
同理:**kwargs **在实参位置时,如果是字典tuple也可以打散,直返放在形参聚合
函数的注释:
def chi(food, drink):
"""
这里是函数的注释, 先写一下当前这个函数是干什么的, 比如我这个函数就是一个吃
:param food: 参数food是什么意思
:param drink: 参数drink是什么意思
:return: 返回的是什么东东
"""
print(food, drink)
return "very good"
二.命名空间:
1.内置命名空间-->存放在python解释器为我们提供的名字,list,tuple,str,int这些内置命名空间
2.全局命名空间-->直接在py文件中,函数外声明的变量都属于全局命名空间
3.局部命名空间-->在函数值声明的变量会放在局部命名空间
加载顺序:内置命名空间-->全局命名空间-->局部命名空间
取值顺序:局部命名空间-->全局命名空间-->内置命名空间
三.作用域
1.全局作用域: 包括全局命名空间+内置命名空间
2.局部作用域:包括局部命名空间
可以通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息
a = 10
def func():
a = 40
b = 20
def abc():
print("哈哈")
print(a, b) # 这里使用的是局部作用域
print(globals()) # 打印全局作用域中的内容
print(locals()) # 打印局部作用域中的内容
func()
四.函数的嵌套:
1.只要遇到()就是函数的调用,如果没有()就不是函数的调用
2.函数的执行顺序 一层一层的看
五.关键字global和nonlocal
global:把全局的量拿到局部来用
a = 100
def func():
global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
a = 28
print(a)
func()
print(a)
lst = ["麻花藤", "刘嘉玲", "詹姆斯"]
def func():
lst.append("马云云") # 对于可变数据类型可以直接进行访问. 但是不能改地址. 说白了. 不能赋值
print(lst)
func()
print(lst)
nonlocal:把离他最近的一层拿过来用,不会找全局
a = 10
def func1():
a = 20
def func2():
nonlocal a
a = 30
print(a)
func2()
print(a)
func1()
结果:
加了了nonlocal
30
30
不不加nonlocal
30
20
函数动态传参,命名空间,gloabal,nonlocal关键字的更多相关文章
- python记录_day10 动态传参 命名空间 作用域
一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...
- js函数动态传参
js函数体内可以通过arguments对象来接收传递进来的参数,利用这一对象属性可以动态传参. function box() { return arguments[0]+' | '+arguments ...
- python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)
一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮&q ...
- 动态传参,命名空间,嵌套,gloabal,nonlocal
一.动态传参 动态接受位置参数: *参数名 def eat(*food): print(food) #多个参数传递进去,收到的内容是元祖tuple eat("盖浇饭", &quo ...
- python-函数-动态传参,作用域的问题,函数嵌套,global nonlocal
⼀. 函数参数--动态传参 之前我们说过了传参, 如果我们需要给⼀个函数传参, ⽽参数⼜是不确定的. 或者我给⼀个 函数传很多参数, 我的形参就要写很多, 很⿇烦, 怎么办呢. 我们可以考虑使⽤动态参 ...
- python函数的动态传参.作用域与命名空间
一.动态传参1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参 def chi(*food): print(food) chi() # 动态传参可以不传参数 chi ...
- python之路--动态传参,作用域,函数嵌套
一 . 动态传参(重点) * , ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...
- python-函数进阶-动态传参,名称空间,作用域的问题
一.函数的动态的动态参数 动态参数分为两种:动态接收位置参数.动态接收关键字参数. 1.*args 位置参数动态传参 # 顺序: 位置参数=>*args(arguments) => 默认 ...
- 2018.8.9 python中的动态传参与命名空间
主要内容: 1.函数参数 ----动态传参 2.名称空间与作用域 3.函数的嵌套 4.global,nonlocal关键字 一.函数参数 ------动态传参 形参的第三种:动态传参 动态传参分为两种 ...
随机推荐
- HZNU-ACM寒假集训Day9小结 倍增
LCA 倍增法求最近公共祖先 首先对于每个结点先进行dfs预处理它的深度,再记录下它们往父亲方向走2的0次,1次...k次步所到达的结点.在这里2的k次大于整棵树的最大深度. 预处理完后,需要查询两个 ...
- c# 数据库操作,多数据库操作、数据库操作异常报错等问题
1.引入相关的命名空间 在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间: System.Data;描述与数据源连接的当前状态. // // 摘要: // 连 ...
- c++ rand随机数生成(随机种子设置)
需求:每次初始化不同的随机数 1.默认 //这样用每次都会产生相同数字 #include <stdlib.h> #include <stdio.h> #define N 10 ...
- Shell脚本exit用法与区别
在Shell脚本中,往往会遇到一些判断类型为某个值不符合预期值的时候就退出主脚本/当前脚本/当前函数,那么Exit与return的用法与区别是什么呢? 下面先使用Exit举个简单例子,脚本内容如下 # ...
- 记录 TypeError: render() got an unexpected keyword argument 'renderer' 错误
在网上看到MXShop这个项目,适合Python, Django + drf 进阶的,其中遇到 TypeError: render() got an unexpected keyword argume ...
- SQL基础教程(第2版)第3章 聚合与排序:3-1 对表进行聚合查询
3-1 对表进行聚合查询 ● 使用聚合函数对表中的列进行计算合计值或者平均值等的汇总操作.● 通常,聚合函数会对NULL以外的对象进行汇总.但是只有COUNT函数例外,使用COUNT(*)可以查出包含 ...
- PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]
题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...
- (综合)P2089 烤鸡
题解: 错误的: #include<stdio.h>int n,ret=0,a[10000][10];int p(int c,int s){ int i; for(i=1;i<=3; ...
- MyBatis中foreach传入参数为数组
一.当只有一个参数,并且这个参数是数组时 接口方法的参数不需要添加@Param注释,collection="array" 示例 接口的方法 void deleteMulti(Str ...
- Mybatix实现in查询(五)
在这一节,我们要向大家介绍一下在Mybatis中想要实现in查询,Mapper文件应该怎么配置. 1)在com.mybatis.dao.PartDao中增加接口函数 public List<Pa ...