一.用字典映射代替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杂记的更多相关文章

  1. Python(十二) Pythonic与Python杂记

    一.导言 二.用字典映射代替switch case语句   # 字典代替 switch 语句 # switch () # { # case 0 : # dayName= 'a'; # break; # ...

  2. Python之路【第十二篇】:Python面向对象高级

    一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...

  3. 第十二章:Python の 网络编程进阶(一)

    本課主題 RabbitMQ 的介紹和操作 Hello RabbitMQ RabbitMQ 的工作队列 消息确应.消息持久化和公平调度模式 RabbitMQ的发布和订阅 RabbitMQ的主题模式 Ra ...

  4. Python之路,第十二篇:Python入门与基础12

    python3 函数3 装饰器 decorator   *** 概念:装饰器是一个函数,主要作用是用来包装另一个函数或类: 包装的目的:是在不改变原函数名的情况下,改变被包装函数(对象)的行为. 装饰 ...

  5. 十二、导出python脚本

    一.为什么要导出? 导出成多语言脚本,方便二次开发 使用其他语言的test runner 使用自己最熟悉的语言做接口自动化测试 二.导出成python脚本 演示 导出成python的requesy脚本 ...

  6. 练习三十二:用python实现:按相反的顺序输出列表的每一位值

    用python实现:按相反的顺序输出列表的每一位值 1. 使用list[::-1] list1 = ["one","two","three" ...

  7. Python开发【第十二篇】python作用域和global nonlocal

    python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...

  8. 15.Pythonic与python杂记

    switcher ={ :'sunday', :'monday', :'thuesday' } day = day_name=switcher.get(day,'Unknow') print(day_ ...

  9. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

随机推荐

  1. MariaDB的备份与主从、高可用实践

    1.编写脚本,支持让用户自主选择,使用mysqldump还是xtraback全量备份. [root@test-centos7-node1 scripts]# cat chose_backup_mysq ...

  2. 你知道Java中的CopyOnWriteArrayList吗?

    CopyOnWrite CopyOnWrite是什么? CopyOnWriteArrayList源码分享? CopyOnWriteArrayList使用场景? CopyOnWriteArrayList ...

  3. jenkins 配置ssh密钥登录

    1.找到一台服务器执行 ssh-keygen -t rsa 会在目录/root/.ssh生成id_rsa私钥.id_rsa.pub公钥,将公钥的内容写入到同目录下的authorized_keys文件( ...

  4. Java入门 - 高级教程 - 04.序列化

    原文地址:http://www.work100.net/training/java-serialization.html 更多教程:光束云 - 免费课程 序列化 序号 文内章节 视频 1 概述 2 序 ...

  5. 异数OS TCP协议栈测试(一)--数据传输篇

    异数OS TCP协议栈测试(一)--数据传输篇 本文来自异数OS社区 github:   异数OS-织梦师(消息中间件)群: 476260389 测试目标 数据传输IO性能测试,主要是建立连接后测试收 ...

  6. java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession

    java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSessio ...

  7. NOI4.6 1455:An Easy Problem

    描述 As we known, data stored in the computers is in binary form. The problem we discuss now is about ...

  8. 个人第四次作业Alpha2版本测试

    个人第四次作业Alpha2版本测试 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对其他小组的项目进行测试 测试人员 陈杰 学号 20173102 ...

  9. Mysql梳理-关于索引/引擎与锁

    前言 最近突发新型肺炎,本来只有七天的春节假期也因为各种封锁延长到了正月十五,在家实在闲的蛋疼便重新研究了一下Mysql数据库的相关知识,特此总结梳理一下.本文主要围绕以下几点进行: 1.Mysql的 ...

  10. Canny边缘检测算法(基于OpenCV的Java实现)

    目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...