Python3(十二) Pythonic与Python杂记
一.用字典映射代替switch case语句
if/else可以代替switch但是非常不合适。
用字典代替switch:
day = 5
switcher = {
0:'Sunday',
1:'Monday',
2:'Tuesday'
}
day_name = switcher.get(day,'Unknow') print(day_name)
利用get()完整模拟。
在字典中模拟带函数的switch:
day = 6
def get_sunday():
return 'Sunday'
def get_monday():
return 'Monday'
def get_tuesday():
return 'Tuesday'
def get_default():
return 'Unknow'
switcher = {
0:get_sunday,
1:get_monday,
2:get_tuesday
}
day_name = switcher.get(day,get_default)()
print(day_name)
二.列表推导式
根据已经存在的列表创建新的列表:
a = [1,2,3,4,5,6,7,8]
b = [i * i for i in a]
print(b)
#[1, 4, 9, 16, 25, 36, 49, 64]
或者i**2也事代表i的平方。
条件筛选:用列表推导式
a = [1,2,3,4,5,6,7,8]
b = [i**2 for i in a if i >= 5]
print(b)
#[25, 36, 49, 64]
map要结合filter才能实现。
a是集合、字典、元组也可以被推导:
a = {1,2,3,4,5,6,7,8}
b = {i**2 for i in a if i >= 5}
print(b)
三. 字典如何编写列表推导式
tudents = {
'tai':18,
'park':32,
'a':12
}
b = [key for key,value in students.items()]
print(b)
students = {
'tai':18,
'park':32,
'a':12
}
b = {value:key for key,value in students.items()}
print(b)
students = {
'tai':18,
'park':32,
'a':12
}
b = (key for key,value in students.items())
for x in b:
print(x)
四. iterator与generator
迭代器:
可迭代对象和迭代器
可迭代对象(iterable):可被for in循环遍历的对象
迭代器(iterator):是一个对象,可被for in循环遍历。一定是个可迭代对象。
普通对象变成迭代器需要实现__iter__()和__next__():
class BookCollection:
def __init__(self):
self.data = ['《往事》','《只能》','《回味》']
self.cur = 0
def __iter__(self):
return self
def __next__(self):
if self.cur >= len(self.data):
raise StopIteration()
r = self.data[self.cur]
self.cur += 1
return r
books = BookCollection()
for book in books:
print(book)
除了for in 遍历,还可以调用next方法:
books = BookCollection()
print(next(books))
print(next(books))
print(next(books))
迭代器具有一次性,只能遍历一次。若想再次遍历需要实例化一个新的对象。或者:
import copy
books = BookCollection()
books_copy = copy.copy(books) #浅拷贝
若想实现深拷贝的话:
books = BookCollection()
books_copy = copy.deepcopy(books) #生成器
生成器:
打印从0-10000的数字:
n = [i for i in range(0,10001)]
for i in n :
print(i)
可以实现但是太消耗内存。n是一个列表,列表存储需要消耗内存的。
更好的方法:生成器
迭代器是针对一个对象的,生成器是针对一个函数的。
函数实现法:
def gen(max):
n = 0
while n <= max:
print(n)
n += 1
gen(100000)
每次打印的都是实时计算出来的结果,不是都存储起来再打印。
不应该在函数内部实现如print这样的操作。
生成器:
def gen(max):
n = 0
while n <= max:
n += 1
yield n
g = gen(100000)
next(g)
next(g)
for i in g:
print(i)
yield会接着返回的地方继续执行。
n = (i for i in range(0,10001))
此时n也为生成器。
五. None
None 空,不等于空字符串、空列表、0、False
不仅在类型上不同,而且在值的比较上也不相同。
class NoneType
判空操作:
def fun():
return None
a = fun()
if not a:
print('s')
else:
print('f')
if a is None:
print('s')
else:
print('f')
#s
#s
如果 a = []则会进入到不同的分支中去。
推荐if a/if not a来判空。
None 不存在,False 假
14-7 对象存在并不一定是True
None永远对应False
自定义的对象:
class Test():
def __len__(self):
return 0
test = Test()
if test:
print('s')
else:
print('f')
#f #进的是False分支
test存在也有可能是False,需要考虑__len__与__bool__方法。
14-8 __len__与__bool__内置方法
如果没有定义__len__与__bool__方法则默认为True。
__len__返回0则为False,__len__代表长度,只能用int返回。
例外:__len__可返回True和False
调用len()时,则会调用__len__,如果没有__len__,求长度的时候会报错。
一旦加入了__bool__则由__bool__来控制对象的取值。
__bool__只能返回布尔型。
六.装饰器的副作用
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
#@decorator
def f1():
print(f1.__name__)
f1()
#f1 #不加装饰器的函数名字
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
@decorator
def f1():
print(f1.__name__)
f1()
#1532492964.0116718
#wrapper #加装饰器的函数名字
wrapper来字闭包函数。
python->help(len)->打印出内置说明
我们可以通过注释书写help()的内容
加了装饰器之后就无法找到函数的help()了
保证名字不改变:
import time
from functools import wraps
def decorator(func):
@wraps(func)
def wrapper():
print(time.time())
func()
return wrapper
@decorator
def f1():
print(f1.__name__)
f1()
#1532493245.2623913
#f1
wraps传入了原有函数,所以得知了原函数的信息,然后复制到闭包函数上,则信息得以保存。
Python3(十二) Pythonic与Python杂记的更多相关文章
- Python(十二) Pythonic与Python杂记
一.导言 二.用字典映射代替switch case语句 # 字典代替 switch 语句 # switch () # { # case 0 : # dayName= 'a'; # break; # ...
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- 第十二章:Python の 网络编程进阶(一)
本課主題 RabbitMQ 的介紹和操作 Hello RabbitMQ RabbitMQ 的工作队列 消息确应.消息持久化和公平调度模式 RabbitMQ的发布和订阅 RabbitMQ的主题模式 Ra ...
- Python之路,第十二篇:Python入门与基础12
python3 函数3 装饰器 decorator *** 概念:装饰器是一个函数,主要作用是用来包装另一个函数或类: 包装的目的:是在不改变原函数名的情况下,改变被包装函数(对象)的行为. 装饰 ...
- 十二、导出python脚本
一.为什么要导出? 导出成多语言脚本,方便二次开发 使用其他语言的test runner 使用自己最熟悉的语言做接口自动化测试 二.导出成python脚本 演示 导出成python的requesy脚本 ...
- 练习三十二:用python实现:按相反的顺序输出列表的每一位值
用python实现:按相反的顺序输出列表的每一位值 1. 使用list[::-1] list1 = ["one","two","three" ...
- Python开发【第十二篇】python作用域和global nonlocal
python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...
- 15.Pythonic与python杂记
switcher ={ :'sunday', :'monday', :'thuesday' } day = day_name=switcher.get(day,'Unknow') print(day_ ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
随机推荐
- C#调用JS的WebService的方法返回null
连上了别人的VPN后,使用WebService测试软件测试了一下,结果正常,但是当我在vs里面添加WebService服务,调用的时候就出现了问题,问题如下图: 后来问了一下服务端那边的同事,他们说服 ...
- vue 移动端在div上绑定click事件 失效
在.vue的文件中使用了better-scroll,在div标签上绑定click事件后,无效. 原因:使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加上click: t ...
- cogs 886. [USACO 4.2] 完美的牛栏 二分图 匈牙利算法
886. [USACO 4.2] 完美的牛栏 ★★☆ 输入文件:stall4.in 输出文件:stall4.out 简单对比时间限制:1 s 内存限制:128 MB USACO/sta ...
- Flask蓝图(Blueprint)
一.作用 1.目录结构划分 2.url添加前缀 url_prefix 3.应用特殊装饰器,在该蓝图定义的特殊装饰器,只在改蓝图的起效 二.简单示例 1.创建一个项目文件 2.创建一个同名的python ...
- python接口自动化中,注册接口随机生成手机号码
如大家所知在注册接口中,手机号参数需要的是未注册的手机号,而在测试用例中,你写入的手机号不一定是未注册的.所以这时需要对注册接口中传入的手机号做处理.下面我就分享一个课程里面学到的一个处理手机号的py ...
- [bzoj4447] [loj#2010] [Scoi2015] 小凸解密码
Description 小凸得到了一个密码盘,密码盘被等分成 \(N\) 个扇形,每个扇形上有一个数字(0-9),和一个符号("+"或"*") 密码盘解密的方法 ...
- for in 和 for i 十月 javascript 第一弹 记录
for in 里面的 i 不仅有 数字还有这些鬼
- 双指针,BFS与图论(一)
(一)双指针 1.日志统计 小明维护着一个程序员论坛.现在他收集了一份”点赞”日志,日志共有 N 行. 其中每一行的格式是: ts id 表示在 ts 时刻编号 id 的帖子收到一个”赞”. 现在小明 ...
- NOIP游记
好像很久没写博客了诶,NOIP考完,写篇游记吧XD Day 1 紧张紧张,去年第一题小凯的疑惑坑煞我也,今年怕不是什么大凯的疑惑吧... 进考场,重启,下软件,在键盘上猛敲RP++ 发密码辣,FeiX ...
- .Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...