5.3Python函数(三)
目录
前言
这是相继上一篇5.2Python函数(二)后的函数的高阶
(一)装饰器
在不改变原函数的代码,函数的变量名,函数的调用下,给函数附加新的功能,该附加的功能便是装饰器。
一般装饰器都封装成一个函数。
1.简单的装饰器
(1)说明
用闭包来实现装饰器,并且用@函数名来附加
(2)源代码
# 额外代码,实现发说说与发图片前,登陆验证
def check_logo(func):
def inner():
print("登陆验证……")
func()
return inner
# 功能代码块
@check_logo
def fss():
print("发说说")
@check_logo
def ftp():
print("发图片")
# 业务逻辑
btn_index = 2
if btn_index == 1:
fss()
else:
ftp()
(3)输出效果
2.修饰带参数函数的装饰器
(1)说明
我们只有在内部的函数也定义接收参数就可以了,不过为了通用性
我们定义的参数形式是:不定长参数
inner(*args, **kwargs)
(2)源代码
# 写一个装饰器
def zsq(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
return inner
# 写一个功能函数
@zsq
def my_sum(num1, num2):
result = num1 + num2
print(result)
@zsq
def my_sub(a, b, c):
result = a + b - c
print(result)
my_sum(1, 2)
my_sub(4, b=2, c=3)
(3)输出效果
3.修饰带返回值函数的装饰器
(1)说明
我们在内部函数也定义返回的语句,总之要与功能函数步调一致。
result = func(*args, **kwargs)
return result
(2)源代码
# 写一个装饰器
def zsq(func):
def inner(*args, **kwargs):
print("*" * 30)
result = func(*args, **kwargs)
return result
return inner
# 写一个功能函数
@zsq
def my_sum(num1, num2):
result = num1 + num2
print(result)
return result
@zsq
def my_sub(a, b, c):
result = a + b - c
print(result)
return result
r = my_sum(1, 2)
r2 = my_sub(4, b=2, c=3)
print(r)
print(r2)
(3)输出效果
4.自身带参数的装饰器
(1)说明
装饰器的附加功能不是写死的,有时候也需要传递一些值,这时就需要装饰器自身传递参数。
我们只要在外部添加一层函数即可。
(2)源代码
# 定义一个可自身传递参数的装饰器
# 就是在装饰器外面添加一层函数
def get_zsq(char):
# 写一个装饰器
def zsq(func):
def inner(*args, **kwargs):
print(char * 30)
result = func(*args, **kwargs)
return result
return inner
return zsq
# 定义一个功能函数, @相当于一个函数
@get_zsq("=")
def my_sum(a, b, c):
result = a + b + c
print(result)
return result
my_sum(1, b=2, c=3)
(3)输出效果
(二)迭代器
(1)说明
读取数据的一种形式。
创建:iter()
访问:next()
(2)源代码
# iterable(可迭代对象):list,tuple,dict,string,set
# 即可以用for in 来遍历的对象
list1 = ["你好", 2, "me", "you"]
# 可以用于isinstance()来判断是否是iterable
print(isinstance(list1, list))
# 可以用iter()来创建迭代器
list_iterator = iter(list1)
# 用next()访问下一个元素
print(next(list_iterator))
(3)输出效果
(三)生成器
generator(生成器):是一种优雅的迭代器,就是一种特殊的迭代器。
1.创建方式一
(1)说明:
使用生成器表达式创建
(2)源代码
# generator(生成器):是一种优雅的迭代器
# 列表推导式
# l = [i for i in range(50) if i % 2 == 0]
# 生成器表达式--创建生成器
l = (i for i in range(50) if i % 2 == 0)
print(next(l))
print(next(l))
print(next(l))
(3)输出效果
1.创建方式二
(1)说明:
使用yield于语句创建
(2)源代码
# 使用yield的语句来停顿执行,创建生成器
def test():
print("a")
yield 1
print("b")
yield 2
print("c")
yield 3
print("d")
yield 4
# 调用函数
print(test())
# 访问元素
g = test()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# for in 遍历元素
for i in g:
print(i)
(3)输出效果
(四)递归函数
(1)说明
递归函数是一种思想,函数不断的调用自身。
(2)源代码
# 函数A内部继续调用A函数,称递归
# 传值:从后往前传递值的过程
# 回归:从前往后回代数值的过程
# 求一个数的阶乘
def test(n):
if n == 1:
return 1
# 分解n
result = n * test(n-1)
return result
print(test(4))
(3)输出效果
(五)变量的作用域
(1)说明图
(2)源代码
# 变量的作用域:作用范围
# 命名空间:具体的范围
g = "我是全局变量"
def test():
# 声明g是全局变量
global g
g = "我有全局变量修改而来"
e = "我是局部变量"
# 查看局部变量
num = locals()
print(num)
def test1():
# 声明 e 不是当地变量
nonlocal e
e = "我是局部变量修改而来"
l = "我是函数内的变量"
# 查看局部变量
num1 = locals()
print(num1)
test1()
# 查看全局变量
num2 = globals()
print(num2)
test()
print(g)
(3)输出效果
作者:Mark
日期:2019/02/06 周三
5.3Python函数(三)的更多相关文章
- javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python函数知识六 内置函数二、匿名函数与内置函数三(重要)
19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...
- php中的字符串常用函数(三) str_replace() 子字符串替换
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ); 该函数返回一个字 ...
- python学习笔记12(函数三): 参数类型、递归、lambda函数
一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...
- js值类型转换(boolean/String/number),js运算符,if条件,循环结构,函数,三种弹出框
js值类型转换 number | string | boolean boolean类型转换 num = 0; var b1 = Boolean(num); console.log(b1) 转化为数字类 ...
- DAY14 函数(三)
一.三元表达式 三元运算符:就是if...else...的语法糖但是只支持只有一条if...else...语句的判断 原: cmd = input('cmd:') if cmd.isdigit(): ...
- Ext.Js核心函数( 三)
ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...
- Python小白学习之路(十八)—【内置函数三】
一.对象操作 help() 功能:返回目标对象的帮助信息 举例: print(help(input)) #执行结果 Help on built-in function input in module ...
- 一、MySQL中的索引 二、MySQL中的函数 三、MySQL数据库的备份和恢复 四、数据库设计和优化(重点)
一.MySQL中的索引###<1>索引的概念 索引就是一种数据结构(高效获取数据),在mysql中以文件的方式存在.存储建立了索引列的地址或者指向. 文件 :(以某种数据 结构存放) 存放 ...
随机推荐
- Android应用内实现视频播放--腾讯浏览服务(TBS)
TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, ...
- SpringMVC之文件上传异常处理
一般情况下,对上传的文件会进行大小的限制.如果超过指定大小时会抛出异常,一般会对异常进行捕获并友好的显示出来.以下用SpringMVC之文件上传进行完善. 首先配置CommonsMultipartRe ...
- C语言第五讲,语句 顺序循环选择.
C语言第五讲,语句 顺序循环选择. 一丶语句的简明了解 我们知道,在编写C语言程序的时候,代码是顺序执行的. 从上往下执行. 但是我们可以控制流程的. 在控制之前,我们要先熟悉什么是语句. 相比大家学 ...
- PHP错误解决:Fatal error: Unknown: Failed opening required ...
最近学习PHP,使用XAMPP在Ubuntu下配置完Apache等之后,尝试了一下,但出现如下错误: Warning: Unknown: failed to open stream: 鏉冮檺涓嶅 i ...
- Beego学习笔记
Beego学习笔记 Go 路由(Controller) 路由就是根据用户的请求找到需要执行的函数或者controller. Get /v1/shop/nike ShopController Get D ...
- SpringMVC入门学习(一)
SpringMVC入门学习(一) ssm框架 spring SpringMVC是一个Java WEB框架,现在我们知道Spring了,那么,何为MVC呢? MVC是一种设计模式,其分为3个方面 mo ...
- [POI2006] PRO-Professor Szu
Description \(n\) 个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条不同即称两方式不同). 询问最多的不同方式 ...
- 动态规划法(六)鸡蛋掉落问题(一)(egg dropping problem)
继续讲故事~~ 这天,丁丁正走在路上,欣赏着路边迷人的城市风景,突然发现前面的大楼前围了一波吃瓜群众.他好奇地凑上前去,想一探究竟,看看到底发生了什么事情. 原来本市的一位小有名气的科学家 ...
- C#基础知识回顾-- 反射(2)
使用反射调用方法: 一旦知道一个类型所支持的方法,就可以对方法进行调用.调用时,需使用包含在 MethodInfo中的Invoke()方法.调用形式: object Invoke(object ...
- Vue 系列之 渲染与事件处理
渲染相关 列表渲染 与 条件渲染 Vue 中的常见的渲染有 列表渲染 和 条件渲染 所谓条件渲染,则是通过添加一定的逻辑条件来进行 Dom 元素的操作 v-if v-else v-else-if &l ...