python笔记13
今日内容
- 装饰器
- 推导式
- 模块【可选】
内容回顾
- 函数
- 参数
- def (a1,a2):pass
- def (a1,a2=None):pass 默认参数推荐用不可变类型,慎用可变类型。
- def(*args,**kwargs):pass
- 注意:位置参数 > 关键字参数
- 面试题
函数可以做参数【知识点】。
def func(arg):
arg()
def show():
pass
func(show)函数的参数传递的是什么?【内存地址=引用 or 值】
v = [11,2,33,4]def func(arg):
print(id(arg)) # 列表内存地址 print(id(v)) # 列表内存地址
func(v) # 传递的是内存地址。
*args和**kwargs的作用
- 返回值
常见数据类型可以返回
函数也可以返回
def func():
def inner():
pass
return innerv = func()
特殊
- 默认没返回就是None
- return 1,2,3 等价于 return (1,2,3,4,)
- 执行函数
函数不被调用,内部代码永远不执行。
def func():
return i
func_list = []
for i in range(10):
func_list.append(func)print(i) # 9
v1 = func_list[4]()#9
v2 = func_list[0]()#9
func_list = []
for i in range(10):
# func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。)
func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。) print(func_list)#列表,10个函数的内存地址。 print(func_list[2]())#9
执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包
def base():
return idef func(arg):
def inner():
return arg
return inner base_list = [] # [base,base,]
func_list = [] # [由第一次执行func函数的内存地址,内部arg=0 创建的inner函数,有arg=1的inner函数 ]
for i in range(10): # i = 0 ,1
base_list.append(base)
func_list.append(func(i)) # 1. base_list 和 func_list中分别保存的是什么?
"""
base_list中存储都是base函数。
func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。
"""
# 2. 如果循环打印什么?
for item in base_list:
v = item() # 执行base函数
print(v) # 都是9
for data in func_list:
v = data()
print(v) # 0 1 2 3 4 。在for循环过程中,func(i)已经执行,for循环过程中i的变化值已经被包在其中。
总结:
- 传参:位置参数 > 关键字参数
- 函数不被调用,内部代码永远不执行。
- 每次调用函数时,都会为此次调用开辟一块内存,内存可以保存自己以后想要用的值。
- 函数是作用域,如果自己作用域中没有,则往上级作用域找。
- 内置和匿名函数(精英)
- 内置函数
- 匿名函数
- 模块
- getpass
- random
- hashlib
内容详细
- 作业题讲解
2.装饰器
v = 1
v = 2
# ########################
def func():
pass
v = 10
v = func
# ##########################
def base():
print(1)
def bar():
print(2)
bar = base
bar()
def func():
def inner():
pass
return inner
v = func()
print(v) # inner函数
# #########################################
def func(arg):
def inner():
print(arg)
return inner
v1 = func(1)
v2 = func(2)
print(v1,v2)
#两个inner函数内存地址。
# #########################################
def func(arg):
def inner():
arg()
return inner
def f1():
print(123)
v1 = func(f1)
v1()
# ###########################################
def func(arg):
def inner():
arg()
return inner
def f1():
print(123)
return 666
v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123
print(result) # None
# ###########################################
def func(arg):
def inner():
return arg()
return inner
def f1():
print(123)
return 666
v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123
print(result) # 666
def func():
print(1)
v1 = func
func = 666
===================装饰器=
def func(arg):
def inner():
print('before')
v = arg()
print('after')
return v
return inner
def index():
print('123')
return '666'
# 示例一
"""
v1 = index() # 执行index函数,打印123并返回666赋值给v1.
"""
# 示例二
"""
v2 = func(index) # v2是inner函数,arg=index函数
index = 666
v3 = v2()
"""
# 示例三
"""
v4 = func(index)
index = v4 # index ==> inner
index()
"""
# 示例四
index = func(index)
index()
def func(arg):
def inner():
v = arg()
return v
return inner
# 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
@func
def index():
print(123)
return 666
print(index)
index=func(index)
index()
装饰器:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。 (之前和之后增加某些功能-func)
应用:
# 计算函数执行时间
import time
def wrapper(func):
def inner():
start_time = time.time()
v = func()
end_time = time.time()
print(end_time-start_time)
return v
return inner
@wrapper
def func1():
time.sleep(2)
print(123)
@wrapper
def func2():
time.sleep(1)
print(123)
def func3():
time.sleep(1.5)
print(123)
func1()
#装饰器作用,在变动原函数(func)的基础上,增加原函数的功能(在wrapper里增加)。
#在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。
总结
目的:在不改变原函数的基础上,再函数执行前后自定义功能。
编写装饰器 和应用
# 装饰器的编写
def x(func):
def y():
# 前
ret = func()
# 后
return ret
return y# 装饰器的应用
@x
def index():
return 10 @x
def manage():
pass # 执行函数,自动触发装饰器了
v = index()
print(v)
应用场景:想要为函数扩展功能时,可以选择用装饰器。
记住:
装饰器编写格式
def 外层函数(参数): #参数是函数名
def 内层函数(args,**kwargs):
return 参数(args,**kwargs)
return 内层函数装饰器应用格式
@外层函数
def index():
passindex()
问题:为什么要加 *args, **kwargs
3.推导式
- 列表推导式
基本格式
"""
目的:方便的生成一个列表。
格式:
v1 = [i for i in 可迭代对象 ]
v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append
"""
v1 = [ i for i in 'alex' ]
v2 = [i+100 for i in range(10)]
v3 = [99 if i>5 else 66 for i in range(10)]def func():
return 100
v4 = [func for i in range(10)] v5 = [lambda : 100 for i in range(10)]
result = v5[9]() def func():
return i
v6 = [func for i in range(10)]
result = v6[5]() v7 = [lambda :i for i in range(10)]
result = v7[5]() v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
# 1.请问 v8 是什么?
# 2.请问 v8[0](2) 的结果是什么? # 面试题
def num():
return [lambda x:i*x for i in range(4)]
# num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ]) # [6,6,6,6] # ##################### 筛选 #########################
v9 = [i for i in range(10) if i > 5]
- 集合推导式
v1 = { i for i in 'alex' } - 字典的推导式
v1 = { 'k'+str(i):i for i in range(10) }
今日总结
装饰器 (6**)
- 编写格式:双层嵌套函数
- 应用格式:@外层函数
- 理解:
变量赋值
def func():
print(1)v1 = func
func = 666
看看到底return的是什么?
自己 > 上级作用域
- 背会:
@xx # index = xx(index)
def index():
pass
index()
推导式(3*)
模块
import timev = time.time() # 获取当前时间
time.sleep(2) # 睡2秒
python笔记13的更多相关文章
- python笔记-13 mysql与sqlalchemy
一.RDBMS relational database management system 关系型数据库引入 1.数据库的意义 更有效和合理的存储读取数据的一种方式 关系模型基础上的数据库 -> ...
- Python笔记 #13# Pandas: Viewing Data
感觉很详细:数据分析:pandas 基础 import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...
- MIT 计算机科学及编程导论 Python 笔记 1
计算机科学及编程导论在 MIT 的课程编号是 6.00.1,是计算机科学及工程学院的经典课程.之前,课程一直使用 Scheme 作为教学语言,不过由于 Python 简单.易学等原因,近年来已经改用 ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- python笔记 - day5
python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...
- guxh的python笔记一:数据类型
1,基本概念 1.1,数据类型 基本数据类型:字符串,数字,布尔等 引用数据类型:相对不可变(元组),可变(列表,字典,集合等) 基本数据类型存放实际值,引用数据类型存放对象的地址(即引用) ==:判 ...
- s21day12 python笔记
s21day12 python笔记 一.函数中高级 1.1 函数可以做返回值 #示例: def func(): print(123) def bar(): return func v = bar() ...
- python笔记-1(import导入、time/datetime/random/os/sys模块)
python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...
- python 笔记-转
python笔记 Python 学习笔记 - 14.技巧(Tips) Python 学习笔记 - 13.异常(Exception) Python 学习笔记 - 12.流程控制(Contro ...
随机推荐
- 小白学 Python 爬虫(31):自己构建一个简单的代理池
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- $CF949D\ Curfew$ 二分/贪心
正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...
- .net 异步编程总结
异步的方式,就是,先发起IO.CPU密集工作等,然后函数返回,在IO.CPU密集工作等完成了以后——某个不确定的时刻,再执行后续的代码. 所以,如果使用异步代码,必须注意代码的执行顺序. 所以,异 ...
- linux技巧---创建应用快捷方式
linux中启动或关闭应用有时候比较麻烦,你必须cd到该应用的可执行脚本的目录中再执行该脚本,不能在任意目录下开启或关闭应用..当然,设置了环境变量path可以解决在任意目录下开启应用的问题,但是每个 ...
- 1078 字符串压缩与解压 (20分)C语言
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- django 数据库连接出现的问题
mysqlclient 1.3.3 or newer is required; you have 0.7.11: 解决方法: 将报错文件中的如下代码注释: if version < (1, 3, ...
- ad域-iis
环境准备: 1. win server 服务器安装完成 2.配置主机名 3.配置静态ip 安装ad域和iis 重启服务器 密码记住!!! 点击安装 把服务器的NDS设置成本机ip 重启完成 注意:ad ...
- PS/2的相关知识
PS/2接口 很多微机上采用PS/2口来连接鼠标和键盘.PS/2接口与传统的键盘接口除了在接口外型.引脚有不同外,在数据传送格式上是相同的.现在很多主板用PS/2接口插座连接键盘,传统接口的键盘可以通 ...
- ip转十进制(PHP、MySQL)
mysql与php中都提供了IP转换十进制数函数 1. IP 由点分格式,转换为数字格式,代码如下: mysql> select inet_aton('127.0.0.1'); +------- ...
- SpringBoot 2.x 开发案例之 Shiro 整合 Redis
前言 前段时间做了一个图床的小项目,安全框架使用的是Shiro.为了使用户7x24小时访问,决定把项目由单机升级为集群部署架构.但是安全框架shiro只有单机存储的SessionDao,尽管Shrio ...