10.Python初窥门径(函数进阶)
Python(函数进阶)
一、函数的传参(接上期)
形参角度(一共四种,后两种)
动态参数(万能参数)*
# 定义一个函数时,*所有的位置参数聚合到一个元组中
def func(*args): # *args这里是一个元组
print(f"名门正派都有:{arg}")
func("少林","武当","峨眉") # 名门正派都有:("少林","武当","峨眉")
---------------------------------
# 定义一个函数时,**所有的关键字参数聚合到一个字典中
def func(**kwargs): # **kwargs这里是一个字典
print(kwargs)
func(name="陈",age=25,hobby="跑步") # {name:"陈",age:25,hobby:"跑步"}
---------------------------------
# *和**可同时使用
def func(*args,**kwargs):
print(args) # ('少林', '武当', '峨眉')
print(kwargs) # {'name': '陈', 'age': 25, 'hobby': '跑步'}
func("少林","武当","峨眉",name="陈",age=25,hobby="跑步")
动态参数*特殊用法
# 函数内*用法
def func(*args): # *args这里是一个元组
print(args)
lis1=["少林","武当","峨眉"]
lis2=["极乐谷","魔教"]
func(*lis1,*lis2) # ("少林","武当","峨眉","极乐谷","魔教")
# 当函数的执行时,*iterable代表打散
---------------------------------
def func(**kwargs): # **kwargs这里是一个字典
print(kwargs)
dic1={name:"陈",age:25,hobby:"跑步"}
dic2={name:"王",age:27,hobby:"游戏"}
func(**dic1,**dic2) # {name:"陈",age:25,hobby:"跑步",name:"王",age:27,hobby:"游戏"}
# **dict代表打散,此方式只能打散字典
#函数外*用法
a,b,*c=[1,2,3,4,5,6,7]
print(a,b,c) # 1,2,[3,4,5,6,7]
# 在函数外*用于处理剩余元素,以列表的形式将剩余元素整合在一起
形参角度的最终顺序
- args不能放在位置参数前面
- args不能放在默认参数后面
- **kwargs不能放在默认参数前面
def func(a,b,*args,sex="man",**kwargs):
仅限关键字参数(了解即可)
# 在形参中以位置参数形式存在关键字参数与**kwargs之间,但是实参必须使用关键词方式传参.
def func(a,b,*args,sex="man",c,**kwargs):
print(a,b,args,sex,c,kwargs)
func(1,2,3,4,5,c=[6,7],name="陈",age=25)
# 执行结果 : 1 2 (3, 4, 5) man [6, 7] {'name': '陈', 'age': 25}
二、从空间角度研究函数
- 全局名称(命名)空间 : py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量(地址)的对应关系,整个py文件结束才会消失.
- 临时(局部)名称空间 : 函数执行时,在内存中临时开辟一个空间,存放的函数中的变量
- 内置名称空间 : 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
三、取值顺序加载顺序
- 加载顺序 : 内置名称空间>>全局名称空间>>(当函数执行时)局部名称空间
- 取值顺序 : 满足就近原则,单项不可逆.
- 在全局中寻找时,全局名称空间>>内置名称空间
- 在局部中寻找时,局部名称空间>>全局名称空间>>内置名称空间
四、作用域与内置函数
全局作用域 : 全局名称空间+内置名称空间
局部作用域 : 局部名称空间
内置函数 : globals,locals
globals() # 以字典的形式返回全局作用域所有的变量对应关系
locals() # 以字典的形式返回当前作用域的变量的对应关系
# 在全局作用域下打印,则他们获取的都是全局作用域的所有的内容。
a = 2
b = 3
print(globals())
print(locals())
'''
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001806E50C0B8>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'D:/lnh.python/py project/teaching_show/day09~day15/function.py',
'__cached__': None, 'a': 2, 'b': 3}
'''
---------------------------------
# 在局部作用域中打印。
a = 2
b = 3
def foo():
c = 3
print(globals()) # 和上面一样,还是全局作用域的内容
print(locals()) # {'c': 3}
foo()
五、高阶函数(嵌套函数)
# 实例1:
def func1():
print('in func1')
print(3)
def func2():
print('in func2')
print(4)
func1() # in func1 3
print(1) # 1
func2() # in func2 4
print(2) # 2
---------------------------------
# 例2:
def func1():
print('in func1')
print(3)
def func2():
print('in func2')
func1()
print(4)
print(1) # 1
func2() # in func2 in func1 3 4
print(2) # 2
---------------------------------
# 例3:
def fun2():
print(2)
def fun3():
print(6)
print(4)
fun3()
print(8)
print(3) # 3
fun2() # 2 4 6 8
print(5) # 5
六、关键字:global、nonlocal
global关键字有两个作用
声明一个全局变量。
在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
# global第一个功能:在局部作用域中可以更改全局作用域的变量
count = 1
def search():
global count
count = 2
search()
print(count) # 2
---------------------------------
# global第二个功能:利用global在局部作用域也可以声明一个全局变量。
def func():
global a
a = 3
func()
print(a) # 3
nonlocal是python3中新加的功能
与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal.
不能更改全局变量。
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
10.Python初窥门径(函数进阶)的更多相关文章
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- 《Python》 函数进阶和名称空间作用域
函数进阶: 一.动态参数:*args **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...
- Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
- 9.Python初窥门径(函数初识)
Python(函数初识) 一.初识函数 面向过程缺点 : 代码重复,代码描述性不高 函数 : 函数是以功能为导向,一个函数封装一个功能. 函数的优点 : 减少代码重复性,增强了代码的可读性 二.函数的 ...
- python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...
- day09 python之函数进阶
楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...
- Python入门-函数进阶
昨天我们简单的了解了函数的定义,调用,以及传参,其实还有一个更重要的传参:动态传参,让我们继续昨天没有说完的,以及今天我要分享的东西. 一.动态传参 之前我们说过了传参,如果我们需要给一个函数传参,而 ...
- python学习——函数进阶
首先来看下面这个函数. def func(x,y): bigger = x if x > y else y return bigger ret = func(10,20) print(ret) ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
随机推荐
- c#使用itextsharp输出pdf(动态填充表单内容,显示中文)
相关链接: iText的简单应用-字体 c#程序为PDF文件填写表单内容 示例代码: static void Main(string[] args) { BaseFont font = BaseFon ...
- Spring 4.3 的新功能和增强
转载自https://my.oschina.net/waylau/blog/698186 核心容器改进 核心容器额外提供了更丰富的元数据来改进编程. 默认 Java 8 的方法检测为 bean 属性的 ...
- ansible mysql模块的使用今年
摘自: https://www.ibm.com/developerworks/cn/linux/1502_lih_ansible/
- iOS数据持久化存储之属性列表
属性列表(plist) iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary. ...
- 分享知识-快乐自己:什么是MVC
1.什么是mvc: Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里,在改进和个性 ...
- Python 连接Oracle数据库
连接:python操作oracle数据库 python——连接Oracle数据库 python模块:cx_Oracle, DBUtil 大概步骤: 1. 下载模块 cx_Oracle (注意版本) ...
- Mac使用记录
---恢复内容开始--- brew list //查看brew安装东东 ls //当前目录下内容 brew --cache //查看brew下载目录 /usr/local/Cellar/ //隐藏文件 ...
- CodeForces - 884F :Anti-Palindromize(贪心&费用流)
A string a of length m is called antipalindromic iff m is even, and for each i (1 ≤ i ≤ m) ai ≠ am - ...
- MySQL活动期间订单满600元并且在活动日期之前超过30天没有下过单_20161030
计算 活动期间订单满600元并且在活动日期之前超过30天没有下过单 首先拿到这个需求,首先需要明确活动日期区间 10.29-10.31,其次要取这个时间段内某天订单额最高的那天及订单额,再次需要判断这 ...
- P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
P2463 [SDOI2008]Sandy的卡片 套路都差不多,都是差分后二分答案找lcp.只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序 ...