一.用字典映射代替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. Java 基础(一)| 使用泛型的正确姿势

    前言 为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是泛型 泛型,即&qu ...

  2. npm 安装出现 run `npm audit fix` to fix them, or `npm audit` for details 解决办法

    1.npm  audit fix 2. npm audit fix --force 3.npm audit 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链 ...

  3. Asp.Net Core Identity 隐私数据保护

    前言 Asp.Net Core Identity 是 Asp.Net Core 的重要组成部分,他为 Asp.Net Core 甚至其他 .Net Core 应用程序提供了一个简单易用且易于扩展的基础 ...

  4. 如何配置好Selenium2Library的环境

    1.首先是下载如下文件 1,ActivePython-其自带了pip工具,很方便,记得选择activepython是2.7x版本的python: 2.依次安装wxpython,Robotframewo ...

  5. Html中div块居中显示

    表面上这个问题很难,因为涉及到浏览器窗体大小,导致部分界面效果不一致.图中的方法适用于div块大小不变的界面. 如上所示,将其分为两块,margin-left和margin-top的值均分别为widt ...

  6. Processing 3!

    Welcome to Processing 3! Dan explains the new features and changes; the links Dan mentions are on th ...

  7. 快速构建第三方api应用

    1.使用框架和扩展 详细请看composer.json "php": "^7.1.3", "laravel-admin-ext/config" ...

  8. 曹工说Spring Boot源码(13)-- AspectJ的运行时织入(Load-Time-Weaving),基本内容是讲清楚了(附源码)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  9. 【干货】零基础30分钟让你拥有一个完整属于自己的短视频APP系统

      目录 一.附言: 1 二.购买域名和购买服务器: 2 三.搭建服务器环境: 5 四.配置APP前端部分: 8 1.工具以及文件准备: 9 2.配置后端接口地址 11 3.配置APP启动图和启动图标 ...

  10. 1、通过CP数据文件的方式恢复MySQL 从库 启动后报错:Last_IO_Errno: 1236:A slave with the same server_uuid/server_id as this slave has connected to the master;

    1.问题: MySQL从库中查看主从状态: show slave status\G,发现出现IO的报错: Last_IO_Errno: Last_IO_Error: Got fatal error f ...