第五章 函数day2
5.2函数小高级
5.2.1 函数当参数
- 1 函数也可以当返回值
def v(dar):
v = dar()
def n ():
print(444)
v(n)
# 实例2
def v():
print(666)
def n():
return v
m =n()
m()
# 实例3
def func():
print(555)
def info():
print(666)
return func()
v = info()
print(v)
练习
# 实例1 def v(): print(666) def n(): return v m =n() m() # 实例2 def v(): print(666) def n(): print('alex') v() n() # 实例3 name ='alex' def v(): print(name) def v1(): name = 'aicr' print(name) v() # alex v1() # aicr
函数其实也是一种数据类型,可以当变量存储
# 实例1
def fucn():
print('alex')
list = [fucn,fucn,fucn()] # 加()直接执行了
list[0]()
list[1]()
# 实例2
def fucn():
print('alex')
dic = {'k1':fucn,'k2':fucn()}
dic['k1']()
- 面试题
'''用函数实现:
用户输入 f1 话费查询
f2 余额查询
f3 人工服务
f4 宽带业务
'''
# 方法1
usee = input('请输入业务 :')
if usee =='f1':
print(话费查询)
elif usee =='f2':
xxxxx
else:
xxxxxx
# 方法二 函数
def v1():
print('话费')
def v2():
print('余额')
def v3():
print('人工')
def v4():
print('宽带')
dic = {'f1':v1,'f2':v2,'f3':v3,'f4':v4}
usee = input('请输入:')
dic[usee]()
5.2.2 闭包
- 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
- 闭包 就是在内层函数调用外层函数的变量
# 实例1
def func():
a = 2
def info():
print(a) # 调用外层函数
info()
func()
# 实例 2
def get():
name = 'alex'
def info():
print(name)
return info # 返回info的内存id
v = get()
v() # 相当于调用info
# 实例 3
def get(arg):
def func():
return arg
return func()
v = get(666)
print(v)
1 闭包的作用:
- 1 保护变量,不受外部改变
作用 1 保护变量,不受外部改变
'''
a = 10
def func():
global a
a =2
def info():
global a
a = 3
先 func() 再 info() a =3
先 info() 再 func() a= 2
全局变量不稳定,受影响
'''
# 闭包
def func():
a = 10
def info():
print(a)
info()
# 这样保护了变量不受其他影响
作用 2 使变量常驻内存
def func():
a = 10
def info():
print(a)
return info
v = func()
v()
2 查看是不是闭包
def func():
a = 10
def info():
print(a)
info()
print(info.__closure__) # 不是闭包返回 None
func()
3 闭包应用
'''
闭包 应用 简易版爬虫
'''
from urllib.request import urlopen
def func():
get = urlopen('https://www.dytt8.net/').read()
def info():
print(get)
return info
print('第一次,慢')
v = func()
v()
print('以后就在内存读出')
v()
v() # 闭包常驻内存 , 直接内存读出
5.2.3 lambda 函数表达式
三元运算
print('ture') if v > 6 else print('flase')
lambda ( 匿名函数)
v = lambda x: x*3
print(v(3))
v = lambda x,y:x*y
print(v(4,6))
# 三元运算和lambda
n = lambda x:x if x<4 else x+1
print(n(14))
# 也可以当作参数
lst = [lambda x: x*3 ,lambda x: x*3,lambda x: x*3 ]
n = lst[0](3)
print(n)
print(lst[1](3))
map + lambda
n = map(lambda x:x*5,[1,2,3,4]) for line in n : print(line)
5.4 高级函数
map (多对一)
# 实例1 n = map(lambda x : x+2,[1,2,3,4]) for i in n: print(i) # 实例2 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] print(lst) '''[<map object at 0x000002B3D40B17F0>, <map object at 0x000002B3D40B1940>, <map object at 0x000002B3D40B1C50>]''' #实例3 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] n = lst[0] for line in n : print(line) # 实例4 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] for i in lst: for line in i: print(line)
filter 过滤掉不符合条件的数据
# 实例1 n = filter(lambda x :x>4,[1,22,33,4,5,]) for line in n: print(line) # 22,33,5 # 实例2 n = filter(lambda x :x if x<4 else print('flase') ,[1,22,3,4,5,]) for line in n: print(line)
5.5 推导式
列表
lst = [i for i in range(10)] lst1 = [1 for i in range(10)] lst2 = [ i for i in range(10) if i <6] # [迭代的变量 for i in 可迭代的对象 判断 ] lst3 =[ i if i < 5 else 777 for i in range(10) ] print(lst5) # 加if 在for后 , 加 if ....else 在for前 lst4 = [lambda : i for i in range(10)] ''' v =[] for i in range(10): v.append(lambda :i) n = v[1]() print(n)''' lst5 = [ lambda x : x if x+i >10 for i in range(10)] def func(): pass lst6 = [func for i in range(10)] # 面试题 def func(): return [lambda x : x+i for i in range(10)] lst7 = [ i for i in func() ] print(lst7[1](7))
上面这个题。 不要死磕。 能明白多少就明白多少。 这个题对小白很不友好
元祖(集合)
# 元祖和集合都要循坏打印 set1 =(i for i in range(18 )) for i in set1: print(i) set1 ={lambda : i for i in range(18 )} for i in set1: print(i()) def func(): print(222) set3 = (func for i in range(10)) for i in set3: i()
字典
dic ={ 'k%d'%i:i for i in range(10)}
print(dic)
#同列表
5.6 递归
- 函数内部调用自己 (不建议,占内存)
- python 为了不爆内存 ,限制了递归次数1000次
# 实例1
def func(a):
print(a)
a = a +1
func(a)
func(1)
# 实例2
def func(a):
print(a)
if a < 5:
func( a + 1)
func(1) # 1,2,3,4,5
# 实例3
def func(a):
if a < 5:
func( a + 1)
print(a)
func(1) # 5,4,3,2,1
'''
函数在每进入下一层的时候,当前层的函数并未结束,它必须等它调用的下一层函数执行结束返回后才能继续往下走。 所以最下面的那句print(n)会等最里层的函数执行时才会执行,然后不断往外退层,所以会出现 5,4,3,2,1的效果
'''
# 实例 4
def func(a):
if a ==5:
return a
info = func(a + 1) + 10
return info
v = func(1)
print(v) # 34
5.7 装饰器
1. 什么是装饰器
装饰器就是在不改变原函数的情况下,调用函数前后增加代码
def func(arg): def info(): print('aaaaaaaaaaaaaaaaaaa') arg() return info def v(): xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx print(1111111111111) return 3333 data = func(v) data() def v1(): xxxxxxxxxxxxxxxxxxx print('alex') xxxxxxxxxxxxxxxxxxx lst = func(v1) lst() ''' 如果在 函数v 和函数v1 加上百行代码, 你要一个一个加 函数如果不只有 v v1 很多 怎么办 -------------装饰器-------------- ''' # 实例1 def func(arg): def info(): print('alrx sb') # 在调用函数前打印 alx sb arg() print('aaaaaaaaaaa') #在调用函数后打印 aaaaaaaaa return info def v(): print(1111111111111) data = func(v) # func的参数传入v函数 此时data = info 函数 data() # 执行data = 执行 info() # 实例2 def func(arg): def info(): print('aaaaaaaaaaaaa') v = arg() return v return info def v(): print(1111111111111) return 3333 data = func(v) print(data())
2. 装饰器基本格式
'''
上面的装饰器很low 因为 如果装饰上百个函数的话
要重复 赋值操作
'''
def func(arg):
def info():
print('alex sb')
arg()
print('aaaaaaaaaa')
return info
@func
# @func 简化 func函数的赋值
# @ 函数 第一步,调用func 把下面的函数名当做func函数的参数 # arg = v
# 第二步 , func 的return info,赋值给下面函数 v = info
# 但是 func中 arg还是指向 v函数id 而 v 重新的赋值
def v():
print(666)
v()
3.关于参数装饰
# 实例1
'''
如果装饰的函数需要传参数
'''
def func(arg):
def info(a):
arg(a)
return info
@func
def data(n):
print(n)
data()
# 第一步 执行func(data)
# data = info函数
#执行data(参数)
########如果被装饰的函数n个参数,需要改装饰器
# 优化
def func(arg):
def info(*args,**kwargs):
arg(*args,**kwargs) # 加上*args **keargs 不用管被装饰的函数需要几个参数都能传
return info
@func
def data(n1,n2,n3):
print(n1,n2,n3)
data(1,2,n3=3)
@func
def inner(a1,a2,a3,a4):
print(a1,a2,a3,a4)
inner('alex',1,2,3) # alex 1 2 3
装饰器标准格式
def func(arg): def info(*args,**kwargs): data = arg() return data return info @func
4.关于返回值
# 实例1
def func(arg):
def info(*args,**kwargs):
data = arg(*args,**kwargs)
return data
return info
@func
def inner():
print('alex')
v = inner()
print(v) # none
# 实例2
def func(arg):
def info(*args,**kwargs):
data = arg(*args,**kwargs)
return data
return info
@func
def inner():
print('alex')
return 666
v = inner()
print(v) # 666
# 练习题
# 1 判断文件是否存在
'''
imprt os
os.path.exists()
True or flase
'''
import os
def func(arg):
def info(*args,**kwargs):
# 检查文件的路径是否存在
lst= args[0]
if not os.path.exists(lst):
print('路径不存在')
return None
data = arg(*args,**kwargs)
return data
return info
@func
def inner(path):
f1 = open(path,mode='r',encoding='utf-8')
v = f1.read()
print(v)
f1.close()
return True
v = inner("E:\代码库\电影下载地址.txt")
print(v)
5. 带参数的装饰器
# 实例1
def inner(a): # 在闭包外再嵌套一层,即带参数的装饰器
print(a)
def func(arg):
def info(*args,**kwargs):
data = arg(*args,**kwargs)
return data
return info
return func
@inner('alex')
# 执行 inner
# inner 返回的值func @func
# 执行ear = func(ear) = info
# 执行info函数
def ear(v):
print(v)
n = ear(111)
print(n)
# 实例2
def inner(a):
print(a)
def func(arg):
def info(*args,**kwargs):
data = arg(*args,**kwargs)
return data
return info
return func
@inner('alex')
def ear(v):
print(v)
return 666
n = ear(111)
print(n)
带参数的装饰器的执行过程其实是这样的。 先inner(xxx) 然后inner函数返回值再和前面的@组合成装饰器
第五章 函数day2的更多相关文章
- C++第五章函数
书上的点: 这次直接写写画画了,遇到的bug也就直接敲了,忘记记录了,好在都在书上,所以勾画一下,提一下.发现每一章后面的小结,都蛮有意思的.可以抄一遍. 1.返回值的函数成为返回值函数(value- ...
- 第十五章 函数————函数的递归、生成器send 、匿名函数
1.生成器send方法 send的工作原理 1.send发生信息给当前停止的yield 2.再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止 例: persons=[ ...
- javascript第五章--函数表达式
① 递归 ② 闭包 ③ 模仿块级作用域 ④ 私有变量
- 15第十五章UDF用户自定义函数(转载)
15第十五章UDF用户自定义函数 待补上 原文链接 本文由豆约翰博客备份专家远程一键发布
- python 教程 第五章、 函数
第五章. 函数 定义语句后面要加冒号 1) 定义函数 def sayHello(): print 'Hello World!' sayHello() 2) 变量作用域 LEGB原则 L本地 ...
- 《python for data analysis》第五章,pandas的基本使用
<利用python进行数据分析>一书的第五章源码与读书笔记 直接上代码 # -*- coding:utf-8 -*-# <python for data analysis>第五 ...
- 读《编写可维护的JavaScript》第五章总结
第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- python学习心得第五章
python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...
随机推荐
- 踩坑 Spring Cloud Hystrix 线程池队列配置
背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔 ...
- 为什么选择 Spring 作为 Java 框架
1. 概述 在本文中,我们将讨论 Spring 作为最流行的 Java 框架之一的主要价值体现. 最重要的是,我们将尝试理解 Spring 成为我们选择框架的原因.Spring 的详细信息及其组成部分 ...
- libvirt-qemu-TLS加密虚拟机传输实例分析
说明 TLS(Transport Layer Security Protocol),即安全传输层协议,其核心是加密两台计算机之间的通信.libvirt中使用TLS,可以实现libvirt的安全加密.可 ...
- spring boot 学习笔记(一)之前端文件配置
一.叙述 spring boot 由于是内置的tomcat ,因此其在独立运行的时候,是不需要单独安装 tomcat,这使其前端文件(CSS.JS.html)等放置的位置与war中的不同. 二.常见配 ...
- Python基础总结之认识lambda函数、map函数、filter() 函数。第十二天开始(新手可相互督促)
今天周日,白天在学习,晚上更新一些笔记,希望对大家能更好的理解.学习python~ lambda函数,也就是大家说的匿名函数.它没有具体的名称,也可以叫做一句话函数,我觉得也不过分,大家看下代码,来体 ...
- 浅入深出Vue:自动化路由
在软件开发的过程中,"自动化"这个词出现的频率是比较高的.自动化测试,自动化数据映射以及各式的代码生成器.这些词语的背后,也说明了在软件开发的过程中,对于那些重复.千篇一律的事情. ...
- Linux基础进程管理
一.进程 了解如进程的: • PID,PPID • 当前的进程状态 • 内存的分配情况 • CPU和已花费的实际时间 • 用户UID,他决定进程的特权 (一).静态查看进程 # ps axu | le ...
- 2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)
题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001 ...
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 主成分分析 Principle Component Analysis
一.主要思想 利用正交变换把可能线性相关变量表示的观测数据,转换为由少数几个线性无关变量(主成分)表示的数据.(重构原始特征空间:线性降维) 要尽可能保留原始数据中的信息,两个思路:最大投影方差.最小 ...