一.动态传参
1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参
def chi(*food):
print(food)
chi() # 动态传参可以不传参数
chi(good_food = "胡辣汤") # 关键字传参
chi("胡辣汤", "疙瘩汤", "西红柿鸡蛋汤")
chi("大猪蹄子","大汉堡","薯条","圣代","雪顶","拿铁")
2.** 表示接收关键字的动态传参接收到的内容放在字典里
def chi(**food):
print(food)
chi(good_food = "哈哈", junk_food="呵呵", drink="吼吼")
chi("大猪蹄子","大汉堡","薯条","圣代","雪顶","拿铁")
1.顺序
位置 > *args > 默认值参数 > **kwargs
实参: 位置 > 关键字
位置, *args, 默认值参数, **kwargs
无敌传参
顺序 位置 > *args > 默认值参数 > **kwargs
def func(*args, **kwargs):
print(args, kwargs)
func(1,2,"哈哈",3,4,5,a=6,b=7,c=8,d=9, e=18 ) lst = ["火腿肠","方便面","有调料包","被捏碎了", "韭菜", "大白菜"]
def chi(*food): # 形参上的* : 动态接收位置参数
print(food)
# 把列表中的所有食物传递给chi
chi(*lst) # 把一个列表或者元组或者字符串.打散成参数. 传递给形参
2.*, ** : 在形参: 聚合, 实参: 打散
dic = {"张无忌":"倚天屠龙记", "乔峰":"天龙八部", "郭靖":"射雕"}
def da(**kwargs): # 动态传参. 接收关键字参数
print(kwargs)
# da(张无忌=dic['张无忌'])
da(**dic) # 把字典打散成关键字参数

二.名称空间和作用域
名称空间: 保存名字用的
变量, 函数, 类

1. 内置名称空间:python自己, print, input, len
2. 全局名称空间: 你写的代码从上到下
3. 局部名称空间: 函数, 类, 方法, 其他模块, 对象

作用域
全局作用域
内置 + 全局
局部作用域
局部名称空间
从局部找全局可以. 但是从全局找局部是不可以的

globals() 查看全局作用域中的名字
locals() 查看当前作用域中的名字

a = 10
def chi():
a = 20
print(a) print(a) # 10
chi() # 20
print(a) # 10 def print(*args):
pass
# print(args) # maximum recursion depth exceeded def func():
print("呵呵") func()
def chi():
p = 30
print(locals()) # {'p': 30} locals()可以查看局部作用域中的内容
print(p)
chi()
print(locals()) # 查看当前作用域中的名字
print(globals())
a = 10 # 全局
b = 20
print(globals()) # 查看全局作用域中(内置+全局)的内容

  

3. 函数的嵌套(难点)
每一层都会产生独自的名称空间

例一
# 一个套一个
def outer():
print("我是outer")
# 在函数内部声明的函数, 只能在函数内部访问
def inner():
print('我是inner')
inner()
print("我是outer_end")
outer() 例二
def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(33)
fun2()
print(555) 33 222 444 666 888 555

  

4. nonlocal global
global: 在局部引入全局的内容, 可以升华一个变量为全局变量
nonlocal : 在局部, 引入上一层名称空间中的变量, 如果没有, 继续上一层

1.global a  #直接从全局把变量引入进来,可以创建(升华)一个局部变量为全局变量
例一
a = 10
def func():
global a # 直接从全局把变量引入进来
a = 20
# a = 20 # 并没有改变全局变量, 创建了一个自己的变量
# 全局变量在局部, 可以用, 但是, 不能改
# a = a + 10
print(a)
func()
print(a)
例二
def func():
global a # 可以创建(升华)一个局部变量为全局变量
a = 30
func()
print(a) 2.nonlocal 在局部, 引入上一层名称空间中的名字. 如果上一层没有, 继续上一层 .....
例一
def outer():
a = 10
def inner():
nonlocal a
a = 20
print(a)
print(a) # 10
inner() # 20
print(a) # 20
outer()
例二
a = 1
def fun_1():
a = 2
def fun_2():
nonlocal 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) # 答案1234331 

三.作业

1,写函数,接收n个数字,求这些参数数字的和。(动态传参)
def num(*args):
sum=0
for i in args:
sum+=i
return sum
print(num(1,2,3,4)) 2,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10
b=20
def test5(a,b):
print(a,b)
c = test5(b,a)
print(c) #20 10没有返回值所以最后打印的值是空 3,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10
b=20
def test5(a,b):
a=3
b=5
print(a,b) #3 5
c = test5(b,a)
print(c ) # 空
print(a,b) #10 20
4,写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),将每个实参的每个元素依次添加到函数的动态参数args里面.
例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
def func(lis,tu):
for i in list(tu):
lis.append(i)
return tuple(lis)
print(func([1,2,3],(22,33))) 5,写函数,传入函数中多个实参(实参均为字典),将每个实参的键值对依次添加到函数的动态参数kwargs里面.
例如 传入函数两个参数{‘name’:’alex’} {‘age’:1000}最终kwargs为{‘name’:’alex’ ,‘age’:1000}
def func(**kwargs):
print(kwargs)
func(**{"name":"alex"},**{"age":1000}) 6, 下面代码成立么?如果不成立为什么报错?怎么解决?
7.1
a = 2
def wrapper():
print(a)
wrapper()
成立
7.2
a = 2
def wrapper():
a += 1
print(a)
wrapper()
不成立,局部空间无法直接调用全局空间中的变量
7.3
def wrapper(): #第一步def直接调用,第二定义,第三执行,第四部
a = 1
def inner():
print(a)
inner()
wrapper()
可执行
7.4
def wrapper():
a = 1
def inner():
a += 1
print(a)
inner()
wrapper()
局部空间的变量不能直接调用和改变外层变量
8,写函数,接收两个数字参数,将较小的数字返回.
def func(a,b):
if a>b:
return b
else:
return a
print(func(3,4))
return a if a<b else b
print(func(3,4))
方案二
def func(a,b):
return a if a<b else b
print(func())
9,写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数)
def func(*args):
print(min(args))
print(max(args))
return {'最大值': max(args),"最小值":min(args)}
print(func(2,4,7,8.0))
10,写函数,传入一个参数n,返回n的阶乘
例如:cal(7) 计算7*6*5*4*3*2*1
def func(n):
s=1
for i in range(1,n+1):
s*=i
return s
print(func(5)) 11写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
pai=[]
s=["红桃","方块","黑桃","梅花"]
t=["A",'2','3','4','5','6','7','8','8','10','J','Q','K']
for i in s:
for j in t:
pai.append((i,j))
print(pai)
print(len(pai))
12 有如下函数:
def wrapper():
def inner():
print(666)
wrapper() 你可以任意添加代码,用两种或以上的方法,执行inner函数.
def wrapper():
def inner():
print(666)
# return inner() #1
# inner() #2
wrapper()

  

python函数的动态传参.作用域与命名空间的更多相关文章

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

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

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

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

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

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

  4. Python函数定义及传参方式

    主要内容:     1.函数初识     2.函数传参方式        (1)位置参数        (2)默认参数        (3)关键参数        (4)非固定传参 一.函数初识 1. ...

  5. python函数关键字实参传参

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 def describe_pet(type,name): print(f"i have a {type} ...

  6. python函数位置实参传参

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 def describe_pet(type,name): print(f"i have a {type} ...

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

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

  8. python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)

    *** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...

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

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

随机推荐

  1. STM32开发 -- 4G模块开发详解(转)

    STM32开发 -- 4G模块开发详解(1) STM32开发 -- 4G模块开发详解(2) STM32开发 -- 4G模块开发详解(3) STM32开发 -- 4G模块开发详解(4)

  2. 腾讯云 网站开启HTTPS

    下图是我站点的初始化样子,可以看到只是输出一个字符串,啥也没有,并且没有https. 这无所谓,因为我们的重点是https,而不是网站内容 接下来就是配置https的关键步骤了,其实只需要三步而已: ...

  3. vs变量监视提示-VAR-CREATE: UNABLE TO CREATE VARIABLE OBJECT解决方法

    昨天有个linux应用在使用vs 远程debug的时候,debug可以正常进行,但是监视变量的时候提示-VAR-CREATE: UNABLE TO CREATE VARIABLE OBJECT,经测试 ...

  4. eclipse maven Errors while generating javadoc on java8

    With JDK 8, we are unable to get Javadoc unless your tool meets the standards of doclint. Some of it ...

  5. The Usage of Lambda and Heap in the C++ STL

    The Usage of Lambda and Heap in the C++ STL Heap In c++ STL, the heap had been implemented as the pr ...

  6. SqlBulkCopy类(将一个表插入到数据库)

    利用SqlBulkCopy类一次插入多条数据,即将一个表直接插入数据库. 首先,新建一个表,要保证表中的列名与数据库表的字段保持一致. 如果数据库一张TableMenuRole表,ID自增,MenuI ...

  7. 线程同步——用户模式下线程同步——Interlocked实现线程同步

    线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...

  8. Python3 tkinter基础 Frame event.x 输出鼠标左右键点击的位置

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. Django框架(九) Django之ORM常用字段和参数

    ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范 ...

  10. [CodeForce 801A] Vicious Keyboard

    题目链接:http://codeforces.com/problemset/problem/801/A 思路:题目中字符串的长度最长100个字符,所以,可以考虑用暴力,先遍历一遍匹配"VK& ...