[TOC]
>[success] # 函数 def
~~~
1.函数:对功能的封装,和为了让代码可以复用,它是命名的用于区分的代码段。函
数可以接受任何类型参数,并且有返回。
2.定义函数: def、函数名、带有函数参数的圆括号,最后紧跟 一个冒号(:),例如:
def 函数名(形参):
函数体
3.函数命名规范和变量命名一样(必须使用字母或者下划线 _ 开头,仅能含 有字
母、数字和下划线)
4.调用函数:函数名(实参)
5.pass:Python 函数中的 pass 表明函数没有做任何事情
~~~
>[danger] ##### 关于return 和 None
* return
~~~
1. return, 函数执行完毕. 不会执行后面逻辑
2. 如果函数中不写return返回None
3. 只写return 返回None
4. return 返回值. 返回一个值
5. return 值1, 值2,... 返回多个值. 调用方接收到的是元组
~~~
* None
~~~
1.None 是 Python 中一个特殊的值,虽然它不表示任何数据,但仍然具有重要的
作用。 虽然 None 作为布尔值和 False 是一样的,但是它和 False 有很多差别。
2.案例解释 实际判断None 用is来做判断:
thing = None
if thing:
print("等同True")
else:
print("等同False")
# 实际使用用is
if thing is None:
print("is 是None")
打印结果:
等同False
is 是None
3.这虽然是一个微妙的区别,但是对于 Python 来说是很重要的。你需要把 None
和不含 任何值的空数据结构区分开来。0 值的整型 / 浮点型、空字符串('')、空
列表([])、 空元组((,))、空字典({})、空集合(set())都等价于 False,但
是不等于 None。
4.更好的区分案例
def is_none(thing):
if thing is None:
print("是None")
elif thing:
print("是true")
else:
print("是False")
>>> is_none(None) It's None
>>> is_none(0.0) It's False
>>> is_none(()) It's False
~~~
>[danger] ##### 参数
~~~
1.在创建函数声明的参数叫形参,调用使用的叫实参
2.位置参数传 入参数的值是按照顺序依次复制过去的。列子:def menu(wine, entree, dessert):
3.关键字参数 为了避免位置参数带来的混乱,调用参数时可以指定对应参数的名
字,例子: menu(entree='beef', dessert='bagel', wine='bordeaux')
4.位置参数和关键字参数的使用,先定义位置参数,在定义关键字参数,例子:
menu('frontenac', dessert='flan', entree='fish')
5.动态参数:位置参数的动态参数: *args,关键字参数的动态参数 : **kwargs
6.*arg 是在形参定义是为了接受实参中不确定个数使用,接受回来的是一个元组
在函数中调用*arg 是将内容元组解包后的采纳数展示,arg是元组形式展示。
7.**kwargs 在形参定义接受键值对形式的参数并且变成字典,在实参的使用方式
例子:(wine='merlot', entree='mutton', dessert='macaroon') ,函数中只能直接使
用kwargs不能加**,kwargs 直接就是一个字典形式
8.位置参数 > *args > 默认值 > **kwargs 例子:def func(a, b, c, *args, d = 5, **kwargsd)
使用效果func(1,2,3,4,5,6,7, d ="马大哈"),d是将默认差数从5变成马大哈.
~~~
>[danger] ##### 函数的命名空间
~~~
命名空间分类:
1. 全局命名空间--> 我们直接在py⽂文件中, 函数外声明的变量量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内 置命名空间
加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间(函数被执⾏行行的时候)
取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
~~~
>[danger] ##### 函数的作用域
~~~
a = 10 # 全局
def func():
a = 20 # 局部
print(a) # 就近原则
print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字
print(locals()) # locals() 查看当前作用域中的所有名字
func()
1. 全局 也就是所有函数都能使用,局部函数内部自己使用其他函数无法使用,
遵循就近原则
2.globals() 获取到全局作用域(内置,全局)中的所有名字
3.locals() 查看当前作用域中的所有名字
4.在函数定义,global a -- a 不再是局部变量. 是全局变量
5.在函数定义,nonlocal a -- a 找局部作用域中 离他最近的那个变量引入进来
~~~
>[danger] ##### 函数嵌套案例
~~~
def fun():
a = 1
print(a)
def fun2():
a = 2
print(a)
fun2()
print(a)
fun()
打印结果(fun2 虽然变量也叫a 但是不会改变fun中的a,证明作用域在自身起作用):
1
2
1
~~~
>[danger] ##### python 和 js 函数作用域区别
* js 可以在函数内改变 var 声明的全局作用域
~~~
var a = 12;
function c(){
a +=1;
console.log(a);
}
c();
打印结果:
13
~~~
* python 不可以更改全局作用域的变量,但可以使用
~~~
a = 1
def c():
print(a) # 可以使用全局作用域的a
# def b():
# a = a+1
# print(a) # 报错
def e():
global a # 可以使用global 引入全局
a += 1
print(a)
c()
e()
print(a)
打印结果:
1
2
2
~~~
- PYTHON-- 基础
- Python -- 变量、常量、注解
- 算数\比较\赋值\逻辑运算符
- Python -- input 控制台用户输入
- Python -- 流程控制/循环语句
- Python -- 切片
- Python -- 数据类型
- 基础数据类型
- int -- 数字类型
- str -- 字符类型
- bool -- 布尔类型
- list -- 列表
- type -- 元祖
- dict -- 字典
- set -- 集合
- Python -- 深浅copy
- Python -- 文件的读写
- Python -- 函数
- 函数 -- 做参数使用
- 函数 -- 闭包
- 函数 -- 生成器
- 函数 -- 列表推导式
- 案例
- 基础案例一
- 基础案例二
- 基础案例三
- COOKBOOK
- LIST、STR、DICT、TUPLE
- LIST - 列表方法总结
- 一、序列拆分成单独变量
- 二、* 妙用
- 三、deque- 双向队列
- 四、求找到最大或最小的N个元素
- 4.1 heapq-- 简单使用
- 五、去重并保持列表顺序不变
- 六、切片slice
- 七、counter 统计序列中元素次数
- 八、itemgetter 列表套着字典排序
- 九、处理大量的列表数据
- 十、随机事件处理列表
- DICT - 字典的总结方法
- 一、defaultdict 解决 KeyError
- 二、OrdereDict有序字典
- 三、zip 和 max/min 比较
- IDCT和LIST- 推导式
- 一、LIST 推导式
- 二、字典推到式
- TUPLE-元组
- 一、命名元组
- STR-字符串
- 一、常见的字符串方法
- 二、字符串拆分
- 三、字符串的位置匹配
- 四、字符串替换
- 五、正则大小写/换行匹配
- 六、对字节类型处理
- 数字、日期、时间处理
- 一、数字的处理
- 二、时间换算
- 2.1 时间运算
- 2.2计算某一时刻上周几的日期
- 2.2对时间转换格式优化
- 迭代器和生成器
- 一、iter 迭代器 使用案例
- 二、生成器 yeild
- 三、构建一个反向迭代方法
- 四、实现反正函数构造
- 五、迭代对象切片/跳过元素
- 六、迭代出所有的组合排列
- 七、索引-值迭代序列化
- 八、zip 同时迭代多个序列
- 九、同时循环多个可迭代对象
- 十、yield from 递归案例
- 十一、合并序列,并按顺序输出
- 十二、使用 iter 替代 while True
- 操作文件
- 一、处理文件路径
- 二、检测文件/获取文件信息
- 函数
- 一、函数基本案例使用
- 二、匿名函数
- 三、回调函数
- 四、闭包实现一个单个方法类
- 五、函数嵌套回调函数
- 类与对象
- 一、str/repr--让类字符串表示
- 二、format -- 格式化类的内容
- 三、with -- 上下文管理类
- 四、创建节省内存的类
- 五、将类里面方法变成属性
- 六、调用父类方法
- 七、扩展子类中的属性
- 八、创建新的类或者实类属性
- 九、简化数据结果,简化init
- 十、python 接口写法
- 十一、通过类属性创建委托访问
- 十二、__new__重新初始化init
- 十三、通过字符串调用类
- 元编程
- 一、装饰器
- 1.1 去掉装饰器修饰
- 1.2 可接受参数装饰器
- 1.3利用装饰器对函数参数类型检查
- 1.4编写类装饰器
- 1.5为类方法和静态方法加装饰器
- 1.6通过装饰器给装饰函数加参数
- 线程和进程