快捷搜索:
来自 计算机编程 2019-11-10 08:07 的文章
当前位置: 67677新澳门手机版 > 计算机编程 > 正文

编写高质量Python代码的59个有效方法,代码结构

第 1 章 用 Pythonic 情势来合计

使用#注释:

在Python中使用#进展标志注释,从#开始到近年来进终止的有些都是注释。注释只对脚下行起功用,而且Python未有多行注释。然则,假若出今后文本串中,将回归日常字符#的角色。


第 1 条:确认本身所用的 Python 版本

  1. python --version

  2. import sys print(sys.version_info) print(sys.version)

使用连接:

意气风发行先后最大尺寸建议80字符。若是生机勃勃行代码写不完,可以选择连接符 (反斜线卡塔尔国把它座落黄金年代行的甘休地方,Python如故将其表明为生机勃勃行。


第 2 条:信守 PEP8 风格标准指南

《 Python Enhancement Proposal #8》(8 号 Python 巩固议事原案卡塔尔国又叫 PEP 8

应用if语句判定:

Computer之所以能做过多自动化的职务,因为它能够本人做规范推断。

举个例子,输入顾客年龄,根据年龄打字与印刷区别的源委,在Python先后中,能够用if语句完成:

age = 20

if age >= 18:

print ('your age is', age)

print ('adult')

print ('END')

注意:Python代码的缩进准绳。拥有相符缩进的代码被视为代码块,上面的3,4行 print 语句就结成贰个代码块(但不富含第5行的print卡塔尔国。倘诺 if 语句决断为 True,就能实施那些代码块。

缩进请严苛依据Python的习于旧贯写法:4个空格,不要选取Tab,更不要混合Tab和空格,不然非常轻易以致因为缩进引起的语法错误。

只顾:if 语句后接表明式,然后用:表示代码块开首。

假诺你在Python人机联作情形下敲代码,还要特意在乎缩进,并且脱离缩进需求多敲风流倜傥行回车:

>>> age = 20

>>> if age >= 18:

...     print ('your age is', age)

...     print ('adult')


第 3 条:了解 bytes、str 与 unicode 的区别

  1. Unicode 字符调换来二进制数据 : encode 方法
  2. 二进制数据调换来Unicode 字符 :decode 方法

行使if-else实行判别:

当 if 语句推断表达式的结果为 True 时,就可以施行 if 富含的代码块:

if age >= 18:

print ('adult')

比如大家想看清年龄在18岁以下时,打字与印刷出 'teenager',咋办?

主意是再写三个 if:

if age < 18:

print ('teenager')

或者用 not 运算:

if not age >= 18:

print ('teenager')

周到的同桌能够发掘,那二种规范剖断是“非此即彼”的,要么相符条件1,要么相符条件2,因而,完全可以用多少个if ... else ... 语句把它们统一齐来:

if age >= 18:

print ('adult')

else:

print ('teenager')

动用 if ... else ... 语句,大家得以依靠法则表明式的值为 True 可能 False ,分别施行 if 代码块只怕 else 代码块。

瞩目: else 前面有个“:”。


Python中的平淡无奇的可比操作符:

相等 ==

不相等  !=

小于  <

不大于 <=

大于  >

不小于 >=

属于  in...

这几个操作符的实践结果都以回去布尔值True也许False。如若向想同时拓宽多种推断,可以运用布尔操作符and,or只怕not连接来决定最后表明式的布尔值。布尔操作符的优先级未有相比较表明式的代码高,约等于说表明式先总结,然后再比较,为了制止混乱,能够用小括号将发布式括起来。

小栗子:x=7    5<x and  x>10 -->False   5<x or  x<10 --> True   5<x and not x>10 -->True

要是对同一个变量做三个and相比操作,Python允许上面包车型地铁用法: 5<x<10-->True

那几个表达式和5<x and x<10 是同等的,也能够采用更加长的可比: 5<x<10<99 -->True 


第 4 条:用扶植函数取代复杂的函数表达式

假设现身复杂的表达式,可以抽调成二个函数方法,若是须求频仍使用同生机勃勃逻辑,更应该把复杂的表达式放进协理函数中。

何以是真值:

一个成假赋值不自然肯定表示为False,下边包车型客车景况也会被认为是False。

布尔 : False

null 类型 : None

67677新澳门手机版 ,整型  0

浮点型: 0.0  

空字符串:' '

空列表: [ ]

空元组:()

空字典:{}

空集合:set()

剩余的都会被以为为真值。

设若您在认清一个表达式不是三个粗略的变量,Python会先总计表明式的值,然后再次回到布尔型结果。栗子: if  color=="red":


第 5 条:通晓切割体系的措施

1.绝不写多余的代码:当 start 索引为 0,或 end 索引为连串长度时,应该将其简要。

  1. 切开操作不会争辨 start 与 end 索引是还是不是越界(如 a[:20] 或 a[-20:])。

3.对 list 赋值的时候,要是选取切丝操作,就能够把原列表中居于相关范围内的值替
换来新值,就算它们的尺寸不相同也一直以来得以交替

采纳while进行巡回:

和for循环分裂,while循环不会迭代list大概tuple成分,而是跟据表明式判定循环是不是截止。

N=10

x=0

while x

print(x)

x=x 1

while循环每便先剖断是不是x

在循环体内,x = x 1 会让 x 不断追加,最后因为 x < N 不创设而退出循环。

若果未有那三个讲话,while循环在认清 x < N 时总是为True,就能够无限循环下去,形成死循环,所以要特地留意while循环的淡出规范。


第 6 条:在单次切块操作内,不要同一时间钦赐 start 、end 和 stride

somelist[伊始索引:结束索引:步进值]

决差异一时间使用 start 、 end 和 stride ,掌握很困难;可以拆作范围切割和步进切割两条赋值表明,或思索选择内置 itertools 模块中的 islice
尽只怕不行使负值的 stride 。

应用break跳出循环:

用 for 循环大概 while 循环时,借使要在循环体内平素退出循环,能够使用 break 语句。

举例总结1至100的整数和,大家用while来完毕:

sum = 0

x = 1

while True:

sum = sum x

x = x 1

if x > 100:

break

print sum

while True 自个儿是一个死循环,然则在循环体内,我们还肯定了 x > 100 条件创建刻,用break语句退出循环,那样也得以兑现循环的扫尾。break是脱离整个循环体。


第 7 条:用列表推导来取代 map 和 filter

a = [1, 2 ,3 ,4 ,5 ,6 , 7, 8, 9, 10]

  1. squares = [x x**2 for x in a if x % 2 == 0]

  2. squares = map(lambda x: x**2, filter(lambda x: x % 2 == 0), a)

结果均为 [4, 16, 36, 64, 100] 。第四在那之中的选择列表推导来做,那么只需在循环前面增多条件表明式就可以;第一个把停放的 f ilter 函数与 map 结合起来,也能达成生机勃勃致的成效,然则代码会写得不行
难懂。
字典与集也支撑推导表明式。

使用continue跳到循环起来:

栗子:读入几个整数,借使是奇数就输出它的平方,假如是偶数则跳过。使用q停止循环

In [1]: while True:

...:    value= input("Integer,please [q to quit] : ")

...:    if value=="q":  #甘休循环

...:        break

...:    number=int(value)

...:    if number %2 ==0: #看清偶数

...:        continue

...:    print (number,"squared is",number*number)


第 8 条:不要使用七个以上的表明式的列表推导

列表推导补助多元循环,每顶尖循环也支撑多项原则。超过多少个表明式的列表推导是很难通晓的,应该尽量幸免。
能够利用四个原则、三个巡回或
二个典型搭配三个循环。如若要写的代码比那还复杂,那就应有采纳普通的 if 和 for 语句,并编写协助函数。

循环外使用else:

假设循环平常截至(未有接收break跳出卡塔尔国,程序将步向到可选的else段。当使用循环来遍历风姿浪漫数据结构的时候,找到知足条件的解使用break跳出;循环甘休,即未有找到可行解时,将实行else部分代码段:

下边推行结果为:No  enen number found


第 9 条:用生成器表明式来改写数据量超大的列表推导

当输入的数据量很大时,列表推导可能会因为占用太多内存而出难题。为了缓和这一个主题素材,Python 提供了生成器表明式(generator expression卡塔尔国,它是对列表
演绎和生成器的意气风发种泛化(generalization卡塔 尔(阿拉伯语:قطر‎。

把贯彻列表推导所用的这种写法放在风姿浪漫对圆括号中,就重新整合了生成器表明式。那时候即时回到一个迭代器,逐次调用内置的 next 函数,以那些迭代器为参数,输出三个值,做巡回输出就可以。

使用for迭代:

Python频繁的行使迭代器。它同意数据结构长度未知和实际实现未知的情状下遍历整个数据结构,並且帮忙迭代神速读写中的数据,以致无法一次读入计算机内部存款和储蓄器的数据流的管理。

列表,字符串,元组,字典,集合等都是Python中可迭代的目的。元组或列表在三回迭代进程发生后生可畏项,而字符串迭代会发生三个字符,对于贰个字典实行迭代可以回来字典中的键,所使用字典的values()函数能够兑现对值的迭代,使用字典的items()函数能够以元组的款式重回键值对。

list=["hello","word","allow","python"]

string="hdsfjmck"

dict={"room":"ballroom","weapon":"lead pipe","person":"xiaom"}

for lists in list:

print(lists)

for chart in string:

print(chart)

for keys,values in dict.items():

print(keys,":",values)


第 10 条:尽量用 enumerate 取代 range

name_list = ['aa', 'bbb', 'cccc', 'ddddd', 'eeeeee']

for i, name in enumerate(name_list):
    print('%d : %s' % (i   1, name))

结果:

1 : aa
2 : bbb
3 : cccc
4 : ddddd
5 : eeeeee

还足以一贯钦命 enumerate 函数最早计数时所用的值(私下认可为0,本例从 1 初步计数卡塔尔国,结果不改变,那样能
把代码写得越来越短。

name_list = ['aa', 'bbb', 'cccc', 'ddddd', 'eeeeee']

for i, name in enumerate(name_list, 1):
    print('%d : %s' % (i , name))

循环外使用else:

就好像于while,for循环也足以选取可选的else代码段,用来判别for循环是或不是健康停止(未有调用break跳出卡塔尔,不然实践else段。


3.11

利用zip()并行迭代:

在迭代的时候尚可zip()进行交互作用迭代,zip()函数在最短序列用完的时候就能够停下。

地方的只可以遍历到desserts的前多个,以最短类别为准。

现使用zip()函数配成对八个元组。函数的重回值既不是元组亦非列表,而是八个构成在协同的可迭代变量,合作dict()函数和zip()函数的重临值能够获取三个字典。


第 11 条:用 zip 函数同有时候遍历四个迭代器

  1. 放到的 zip 函数里能够平行的同期遍历两个迭代器,假诺长度不后生可畏致则会以超短的迭代器为准而得了循环。

  2. python 3 中的 zip 函数也正是生成器,可以逐次发生元组。

  3. python 2 则时三回性生成重返整份列表;如若用 zip 函数遍历的数量很多,则会招致程序崩溃,要求用 itertools 内置模块的 izip 函数

行使range()生成自然数体系:

range()函数重回在一定区间的当然数连串,没有需求创建和存款和储蓄复杂的数据结构,举个例子列表和元组。rang()函数的用法:rang(start,stop,step)。start私下认可值为0,唯意气风发须求的参数是stop,发生的终极三个数是stop的前叁个,况且step的暗中同意值是1。也可以反向创立自然数系列,此时step的值为-1。

像zip(),rang()这个函数的归来的是一个得以迭代的指标,所以能够动用for...in的皆否进行遍历,可能把那个指标转变为八个队列(比如列表卡塔 尔(英语:State of Qatar)。

for x in range(0,3)     list(range(0,3))   


第 12 条:不要在 for 和 while 循环前面写 else 模块

# 判断两个数是否互质
a = 4
b = 9
for i in range(2, min(a, b)   1):
    print('Testing', i)
    if  a % i == 0 and b % i ==0:
        print('Not coprime')
        break
else:
    print('Coprime')

结果:

Testing 2
Testing 3
Testing 4
Coprime

除非当 for 或 while 整个循环主体未有遇上 break 语句时,循环后面包车型大巴 else 模块才会运作。不要在循环前面使用 else 块,难以知晓,用函数再次回到的款式替代。

推导式:

推导式是一个或然四个迭代器急忙简洁地创建数据结构的风姿浪漫种方法。

本文由67677新澳门手机版发布于计算机编程,转载请注明出处:编写高质量Python代码的59个有效方法,代码结构

关键词: