目录

前言

这是相继上一篇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函数(三)的更多相关文章

  1. javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. python函数知识六 内置函数二、匿名函数与内置函数三(重要)

    19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...

  3. php中的字符串常用函数(三) str_replace() 子字符串替换

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ); 该函数返回一个字 ...

  4. python学习笔记12(函数三): 参数类型、递归、lambda函数

    一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...

  5. js值类型转换(boolean/String/number),js运算符,if条件,循环结构,函数,三种弹出框

    js值类型转换 number | string | boolean boolean类型转换 num = 0; var b1 = Boolean(num); console.log(b1) 转化为数字类 ...

  6. DAY14 函数(三)

    一.三元表达式 三元运算符:就是if...else...的语法糖但是只支持只有一条if...else...语句的判断 原: cmd = input('cmd:') if cmd.isdigit(): ...

  7. Ext.Js核心函数( 三)

    ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...

  8. Python小白学习之路(十八)—【内置函数三】

    一.对象操作 help() 功能:返回目标对象的帮助信息 举例: print(help(input)) #执行结果 Help on built-in function input in module ...

  9. 一、MySQL中的索引 二、MySQL中的函数 三、MySQL数据库的备份和恢复 四、数据库设计和优化(重点)

    一.MySQL中的索引###<1>索引的概念 索引就是一种数据结构(高效获取数据),在mysql中以文件的方式存在.存储建立了索引列的地址或者指向. 文件 :(以某种数据 结构存放) 存放 ...

随机推荐

  1. Android并发编程 开篇

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. SQL 必知必会·笔记<15>创建和操纵表

    创建表的两种办法: 使用DBMS 提供的交互式创建和管理数据库表的工具: 直接用SQL 语句创建. 表创建基础 创建表示例: CREATE TABLE Products ( prod_id ) NOT ...

  3. iOS开发(0):框架QMUIKit的使用 | 使用第三方UI框架 | cocoapods的使用

    对于移动APP来说,客户端(iOS或android)的界面开发是必不可少的工作.为了减轻界面开发的工作量,也为了提高开发的速度,选择一个良好的界面框架,是有意义的. iOS开源的界面框架有很多,比如c ...

  4. epoll的ET和LT模式

    epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT). 在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用 ...

  5. 第一个Quartz程序 (二)

    1 我们使用maven项目 2 创建一个job类,在execute()方法里写上业务逻辑代码. 3 在另外一个类中创建触发器,调度器,并且绑定job. 首先在项目的pom.xml引入需要的jar包. ...

  6. OpenCV两种畸变校正模型源代码分析以及CUDA实现

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  7. Umbraco 资源推荐

    Umbraco 社区 Umbraco 官方社区.找到人们谈论当前的 Umbraco 主题的最好方法是通过 Twitter.Umbraco 也知道他们很多的聚会和节日在世界各地举行.Umbraco 的开 ...

  8. [android] 手机卫士自定义组合控件

    设置中心 新建SettingActivity 设置GridView条目的点击事件 调用GridView对象的setOnItemClickListenner()方法,参数:OnItemClickList ...

  9. inheritConstructorStealing.js

    // 借用构造函数 // 其基本思路是在子类型构造函数的内部调用父类型的构造函数 function Person(name){ this.name = name; this.friends = [&q ...

  10. pycharm技巧

    常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在下方新建行并移到新行行首: 3.Ctrl + /:注释(取消注释)选择的行: 4.Ctrl + ...