Python进阶函数
一.函数的动态参数
之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数.
动态参数分成两种:
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进阶函数的更多相关文章
- Python进阶-函数默认参数
Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...
- Python进阶(五)----内置函数Ⅱ 和 闭包
Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- Python进阶(二)----函数参数,作用域
Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...
随机推荐
- xpath语法分享
# xpath语法: ## 使用方式: 使用//获取整个页面当中的元素,然后写标签名,然后再写谓词进行提取.比如: ``` //div[@class='abc'] ``` ## 需要注意的知识点: 1 ...
- Go中使用seed得到相同随机数的问题
1. 重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象. func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now( ...
- python编程基础之三十六
文件处理:文件处理包括读文件,写文件 读文件: 1.打开文件 2.读取文件 3.关闭文件 写文件: 1.打开文件 2.写如文件 3.关闭文件 无论是读取文件还是写文件都时需要打开文件,和关闭文件 打开 ...
- redis之spring应用
前言 读本文之前,需要大家对redis有所了解,大家可以去看一下我之前分享的redis安装及简单使用这一随笔,而本文我将跟大家分享学习一下redis与spring的集成.当然,首先需要打开我们的red ...
- HashTable、Dictionary、ConcurrentDictionary三者区别
转载自https://blog.csdn.net/yinghuolsx/article/details/72952857 1.HashTable HashTable表示键/值对的集合.在.NET Fr ...
- 加密解密 之base系列编码
Base16 Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码.Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来, ...
- linux 防火墙基本使用
写在最前面 由于工作后,使用的Linux就是centos7 所以,本文记录是是centos7的防火墙使用. 从 centos7 开始,系统使用 firewall 进行防火墙的默认管理工具. 基本使用 ...
- 蓝牙TWS耳机IBRT的原理初分析
最近在倒腾TWS对耳的一些东西,看到一些源码,发现一个新概念,IBRT没有搞清楚,抱着吾将上下而求索的态度,详细看了一些代码,查了一些资料,还是发现了不少有价值的信息的.至少,我突然感觉自己懂了一些什 ...
- DRF框架中csrf异常
一.报错信息 "detail": "CSRF Failed: CSRF cookie not set." 二.解决办法 方法一: 在配置文件中配置 REST_F ...
- 什么是STM32的ISP?
上一篇笔记分享了STM32的串口IAP实例:STM32串口IAP分享.其中,下载IAP程序时用ISP的方式进行下载.这里的ISP又是什么呢? ISP方式下载程序原理 ISP:In System Pro ...