目录

前言

这是相继上一篇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. 前端通信:ajax设计方案(十)--- 完善Promise A+规范,增加mock数据功能

    半年不迭代,迭代搞半年,说的就是我,这里有点尴尬了,直接进入主题吧 我记得在这篇博客的时候集成了Promise的,不过那个时候就简简单单的写了一点最基础,在一些特殊的case上,还是有点问题的,所以才 ...

  2. 通过反编译深入理解Java String及intern

    一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往往会涉及比较深入和难度大一点的问题.我在招聘的时候也偶尔会 ...

  3. vue-02-安装-指令

    1, vue安装 1), 安装vue-cli npm install -g cnpm --registry=https://registry.npm.taobao.org 之后可以用 淘宝的npm镜像 ...

  4. 如何做自己的服务监控?spring boot 2.x服务监控揭秘

    Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...

  5. msql 必知必会笔记

    Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表  一组特定类型的数据的结构化清单 什么是模式  数据库和表的布局及特性的 ...

  6. 【IDEA&&Eclipse】4、IntelliJ IDEA上操作GitHub

    IntelliJ IDEA集成了对GitHub的支持,使上传代码到GitHub和从GitHub下载代码更加方便快捷. 1. 分享代码到GitHub 首先需要在IntelliJ配置Git,如果没有正确配 ...

  7. Linux Centos下安装jdk

    1.准备工作 https://www.cnblogs.com/dddyyy/p/9746942.html 上面这篇博客讲了如何安装linux 你想安装的jdk(对应版本的jdk) 连接Linux的软件 ...

  8. blfs(systemd版本)学习笔记-前几章节的脚本配置

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 记录blfs书籍前几个章节的配置内容. bash shell启动文件章节 1.切换root用户 su 2.创建/etc/prof ...

  9. CSS图片两端对齐,自适应列表布局末行对齐修复实例页面

    写在前面 前端开发,图片两端对齐,是十分常见的,也是十分痛苦的,我试过好多方法,通过整理,认为下面还是比较靠谱的,在实践中大家可以试试,欢迎一起学习,一起进步 HTML代码 HTML代码非常简单,用的 ...

  10. CSS&JS两种方式实现手风琴式折叠菜单

    <div class="accordion"> <div id="one" class="section"> < ...