可变长参数

可变长形参: *args

形参中的* 会将溢出的位置实参全部接收, 然后以元祖的形式存储, 并将元祖赋值给*后面的args

# 我们习惯把*后面的形参叫做args
def func(a, *args):
print(args) func(1, 2, 3, 4) # (2, 3, 4)

可变长实参: *容器类

实参中的*会将其后面的容器类型的元素(列表, 集合, 元祖, 字典)依次取出, 变成位置实参

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

可变长形参: **kwargs

形参中的**会将溢出的关键字实参全部接收, 然后以字典的形式存储, 并赋值给后面的kwargs

# 我们习惯把**后面的形参叫做kwargs
def func(a, **kwargs):
print(kwargs) func(1, b=2, c=3) # {'b': 2, 'c': 3}

可变长实参: **字典

实参中的**会将其后面的字典类型key:value取出, 转化为关键字实参(key=value)

def func(a, b, **kwargs):
print(**kwargs) dic = {'c':3, 'd':4}
func(1, 2, **dic) # {'c': 3, 'd': 4}

函数对象

我们可以把函数看做一种数据类型, 函数名就是这个函数的函数对象

引用

def func():
print('from func') print(func) # <function func at 0x00000000024C1E18> f = func
f() # from func

当做容器类型元素

def func():
print('from func') lis = [func, 1, 2, 3] lis[0]() # from func

当做参数传给一个函数

def func1():
print('from func1') def func2(x):
x() func2(func1) # from func1

当做函数的返回值

def func():
print('from func1') def func2(x):
return x res = func2(func1)
res() # from func1

函数对象应用

# 简易购物系统

def register():
print('注册') def login():
print('登录') def shopping():
print('购物') func_dict = {
'1': register,
'2': login,
'3': shopping
} while True:
print('''
1 注册
2 登录
3 购物
''')
choice_inp = input('请选择你需要的功能(输入q退出): ')
if choice_inp == 'q':
break
func_dict[choice_inp]()

名称空间和作用域

名称空间

用来存储名称的空间(变量名/函数名等)

内置名称空间

存储了Python内置方法的名称

局部名称空间

存储了函数内部定义的名称

全局名称空间

除了内置和局部的名称都存储在全局名称空间

空间名称的生成顺序

  1. 内置名称空间: Python解释器启动时
  2. 全局名称空间: 执行文件代码时
  3. 局部名称空间: 函数调用的时

名称空间搜索顺序

比如我们现在要 print(x), Python解释器就会在各个名称空间搜索我们有没有定义过x

搜索顺序: 先从当前名称空间开始寻找, 找不到会按着局部-->全局-->内置-->报错顺序寻找

作用域

全局作用域

全局有效, 全局存活, 包含内置名称空间+全局名称空间

局部作用域

局部有效, 临时存储, 只包含局部名称空间

注意事项

  1. 全局作用域和局部作用域之间是相互独立的

def func():
x = 1
print(f'局部作用域x: {x}') x = 2
func() # x = 1
print(f'全局作用域x: {x}') '''
局部作用域x: 1
全局作用域x: 2
'''
  1. 局部作用域1和局部作用域2之间也是相互独立的
def func1():
x = 1
def func2():
x = 2
print(f'局部作用域2中x: {x}')
func2() # x = 2
print(f'局部作用域1中x: {x}') func1()
'''
局部作用域2中x: 2
局部作用域1中x: 1
'''

补充

  1. global
x = 1

def func():
global x # global声明x为全局变量
x = 2 func()
print(x) # 2
  1. nonlocal
def func1():
x = 1 def func2():
nonlocal x # nonlocal声明x为顶层函数的局部作用域变量
x = 2 f2()
print(x) func1() # 2
  1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
lis = []

def func():
lis.append(1) print(f"调用函数前: {lis}")
func()
print(f"调用函数后: {lis}") '''
调用函数前: []
调用函数后: [1]
'''

Python3 函数基础2的更多相关文章

  1. Python3 函数基础1

    目录 定义函数 定义函数的三种形式 空函数 有参函数 无参函数 函数的调用 函数的返回值 函数的参数 形参 (parameter) 实参(argument) 位置形参与位置实参 默认形参 关键字实参 ...

  2. Python开发基础-Day5-字符编码、文件处理和函数基础(草稿)

    字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...

  3. python开发基础之字符编码、文件处理和函数基础

    字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...

  4. 10分钟学会Python函数基础知识

    看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...

  5. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  6. JavaScript 函数基础

    1. JavaScript 函数基础 1. 定义方法 2. 函数的调用方法 3. 函数方法 apply : 将函数作为数组的方法来调用 将参数以数组形式传递给该方法 call   : 将函数作为对象的 ...

  7. Python 函数基础、有序集合、文件操作(三)

    一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...

  8. 【2017-03-05】函数基础、函数四种结构、ref和out参数、递归

    一.函数基础 1.函数/方法:非常抽象独立完成某项功能的一个个体 2.函数的作用: 提高代码的重用性提高功能开发的效率提高程序代码的可维护性 3.分类 固定功能函数高度抽象函数 4.函数四要素:输入, ...

  9. PHP基础入门(三)---PHP函数基础

    PHP基础入门(三)---函数 今天来给大家分享一下PHP的函数基础.有了前两章的了解,想必大家对PHP有了一定的基础了解.想回顾前两章的朋友可以点击"PHP基础入门(一)"&qu ...

随机推荐

  1. PHP laravel+thrift+swoole打造微服务框架

    Laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱. 笔者也参与过一些由laravel开发的项目.虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器, ...

  2. 021.掌握Pod-Pod调度策略

    一 Pod生命周期管理 1.1 Pod生命周期 Pod在整个生命周期过程中被系统定义了如下各种状态. 状态值 描述 Pending API Server已经创建该Pod,且Pod内还有一个或多个容器的 ...

  3. hdu 1285 确定比赛名次 (topsort)

    确定比赛名次Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. Vue2.x与bootsrap-table动态添加元素和绑定事件无效

    一.问题:     最近在使用vue与bootstrap-table结合生成表格时,按以前的经验----每列数据可用formatter:function(value,row,index){}进行一些其 ...

  5. vim-plug 安装 jedi-vim

    安装: Plug 'davidhalter/jedi-vim' :PlugInstall 我就在配置文件里写了一个配置项 let g:jedi#use_tabs_not_buffers = 1 进入定 ...

  6. 🔥《手把手教你》系列基础篇之3-python+ selenium-驱动浏览器和元素定位大法(详细)

    1. 简介 上一篇中,只是简单地一带而过的说了一些驱动浏览器,这一篇继续说说驱动浏览器,然后再说一说元素定位的方法. 完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱 ...

  7. Nginx 本地建立负载均衡(Windows环境)

    需求: 现在有个需求:两台服务器,建立负载均衡. A服务器:IP:localhost:负载均衡主服务器:代理本地文件夹D:\\SampleData B服务器:IP:10.10.10.10:代理本地文件 ...

  8. html基础——a标签

    a标签:超链接/锚点链接  实现页面跳转  只占据自己内容大小的位置 超链接: 使用 target="_self":表示在本页面跳转到 href 中的地址 target=" ...

  9. 【论文阅读】Diverse Image-to-Image Translation via Disentangled Representations(ECCV2018 oral)

    目录 相关链接 方法亮点 相关工作 方法细节 实验结果 总结与收获 参考文献 相关链接: 论文:https://arxiv.org/abs/1808.00948 代码:https://github.c ...

  10. 【Luogu P1981】表达式求值

    点我进入原题Luogu P1981 [解题思路] 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 [参考程序] # ...