一.函数的动态参数

之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数.

动态参数分成两种:

1. *args 动态接收位置参数

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

 def xue(*language,'a','b'):

   print('我要学:',language,a,b)

 xue('PHP',JAVA,'Python')

如果这个程序不遵循顺序的话就会报错,如上面代码,因为前面传进去的所有位置参数都给*language接收了,a和b永远也接收不了参数

所以必须改写成如下代码:

 # -*- coding:utf-8 -*-
def xue(*language,a,b):
print('我要学:',language,a,b)
xue('JC','PHP',a='java',b='Python')  #必须用关键字指定参数

 这个时候a和b就有值了, 但是这样写呢位置参数就不能用了. 所以. 我们要先写位置参数,然后再用动态参数

 # -*- coding:utf-8 -*-
def xue(a,b,*language):
print('我要学:',a,b,language)
xue('JC','PHP','java','Python') #前两个参数用位置参数来接收,后面的参数用动态参数接收

哪默认值参数呢?

这个时候我们发现所有的默认值都生了. 这个时候如果不给出关键字传参. 那么你的默认值是永远都生效的.

要记住的顺序: 位置参数, 动态参数*, 默认值参数

2. **kwargs 动态接收关键字参数

在python中可以动态的位置参数, 但是*这种情况只能接收位置参数⽆无法接收关键字参数.

在python中使⽤用**来接收动态关键字参数

 def xue(**kwargs):
print(kwargs)
xue(a='Python',b='PHP',c='vb')

这个时候接收到的都是dict(字典)

顺序问题,在函数调用的时候,如果先给出关键字参数,则整个函数都会报错

 def xue(a,b,c,d):
print(a,b,c,d)
#关键字参数必须在位置参数前面,否则参数会混乱至报错
xue(1,2,c='Python',666)

所以关键字参数必须在位置参数后面. 由于实参是这个顺序. 所以形参接收的时候也是这
个顺序. 也就是说位置参数必须在关键字参数前⾯面. 动态接收关键字参数也要在后面
最终顺序(*):
位置参数 > *args > 默认值参数 > **kwargs

函数的注释:

 def XUE(JAVA,PHP):
"""
这个函数是用来总结学的编程语言,
:param JAVA: 参数Java是Java语言
:param PHP: 参数PHP是PHP语言
:return: 返回的是什么东西
"""
print(JAVA,PHP)
return '坚持'

二.命名空间

在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空

 def xue():
a = 'YJ'
print(a)
xue()
print(a) #a已经不存在了已经

1. 内置名称空间:存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

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

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

作用域:

1. 全局作用域: 内置+全局      查看全局作用域globals()

2. 局部作用域: 局部(函数被调用)    查看局部作用域locals()

三,函数名的运用

函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量

1.函数名的内存地址

 2. 函数名可以赋值给其他变量

 3. 函数名可以当做容器类的元素

 4. 函数名可以当做函数的参数

 5. 函数名可以作为函数的返回值

四.函数嵌套

函数可以互相的嵌套

1.只要遇见了()就是函数的调用,如果没有()就不是函数的调用

2.函数的执行顺序

五, global和nonlocal关键

global:在局部访问全局中的内容

 a = 10 # 全局变量本身就是不安全的, 不能随意修改, 闭包
def func():
global a # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
# a = 20
a += 10 # a = a+10
print(a)
func()
print(a)
a = 10
#结果为,20,20

nonlocal:在局部寻找外层函数中离他最近的那个变量

 a = 10
def outer():
a = 'yj'
def inner(): # 在inner中改变a的值
nonlocal a # 寻找外层函数中离他最近的那个变量
a = 20
print(a) inner()
outer()
print(a)

Python进阶函数的更多相关文章

  1. Python进阶-函数默认参数

    Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...

  2. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  3. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  4. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  5. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  6. Python进阶(五)----内置函数Ⅱ 和 闭包

    Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...

  7. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  8. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  9. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

随机推荐

  1. MySql + Workbench使用教程

    Mysql安装及使用 注意:不推荐下载zip版本,需要配置额外的环境变量和其他设置,很复杂.官方的windows安装版本可以自动完成所有操作. 下载地址:https://dev.mysql.com/d ...

  2. 在chrome浏览器中调用IE浏览器并访问(openIE.reg自定义协议)

    在谷歌浏览器中有4种方法调用IE浏览器.如下: c++ socket通过浏览器在ie中打开指定url : vb生成exe,url访问exe启动ie并打开指定url : 通过socket实现通过http ...

  3. 02-05 scikit-learn库之线性回归

    目录 scikit-learn库之线性回归 一.LinearRegression 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 1.5.1 报告决定系数 二.ARDRe ...

  4. 美化你的IDEA—背景图片

    IDEA设置背景图片 很多人都不知道IDEA可以像桌面一样设置背景图片,下面我们来美化我们的开发工具. 有的IDEA版本是搜不到的,我这个就是,现在搜的是已经装好的. 没有的我们可以去http://p ...

  5. Redis Sentinel(哨兵核心机制) 初步深入

    ##### 1.Redis 的 Sentinel 系统用于管理多个 Redis 服务 该系统执行以下三个任务:  1.监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务 ...

  6. 从零学习基于Python的RobotFramework自动化

    从零学习基于Python的RobotFramework自动化 一.        Python基础 1)      版本差异 版本 编码 语法 其他 2.X ASCII try: raise Type ...

  7. GUI篇 tkinter (Label,Button)之一

    import tkinterfrom tkinter import * # tkinter._test() # 实例化一个窗口对象base = tkinter.Tk()# 修改窗口的标题base.wm ...

  8. 基于KVM的SRIOV直通配置及性能测试

    SRIOV介绍.VF直通配置,以及包转发率性能测试 小慢哥的原创文章,欢迎转载 目录 ▪ 1. SRIOV介绍 ▪ 2. 环境说明 ▪ 3. 开启SRIOV ▪ 4. 生成VF ▪ 5. VF直通 ▪ ...

  9. Beautiful Soup 4.2.0 文档(一)

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...

  10. 怎么将ETL技术落地

    ETL概述 ETL(Extraction-Transformation-Loading)是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到 ...