>>> numbers = [45,22,14,65,97,72]>>>for i, num inenumerate(numbers):... if num %3==0and num %5==0:... numbers[i]='fizzbuzz'... elif num %3==0:... numbers[i]='fizz'... elif num %5==0:... numbers[i]='buzz'...>>> numbers['fizzbuzz',22,14,'buzz',97,'fizz']# 对于每个元素,enumerate()返回一个计数器和元素值。计数器默认为0,也是元素的索引。不想在0开始你的计数?只需使用可选的start参数来设置偏移量>>> numbers = [45,22,14,65,97,72]>>>for i, num inenumerate(numbers, start=52):... print(i, num)...524553225414556556975772
列表递推式
列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。
通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。如果列表推导的代码超过了两行,你可能就要考虑是不是得用 for 循环重写了。
>>> numbers = [4,2,1,6,9,7]>>>defsquare(x):... return x*x...>>>list(map(square, numbers))[16,4,1,36,81,49]>>> [square(x)for x in numbers][16,4,1,36,81,49]# 使用map()和列表推导的两种方法都返回相同的值,但列表推导更容易阅读和理解。>>>defis_odd(x):... returnbool(x %2)...>>>list(filter(is_odd, numbers))[1,9,7]>>> [x for x in numbers ifis_odd(x)][1,9,7]# ,filter和列表推导方法返回相同的值,但列表推导更容易理解。
# 列表推导也支持多个if条件。处在同-循环级别中的多项条件,彼此之间默认形成and表达式。# 例如,要从数字列表中选出大于4的偶数,那么下面这两种列表推导方式是等效的。a = [i for i inrange(10)]b = [x for x in a if x>4if x%2==0]c = [x for x in a if x>4and x%2==0]
# 前面提到,列表推导是方便的工具,但有时会导致不必要的内存使用。# 错误方式>>>sum([i * i for i inrange(1, 1001)])333833500# 正确方式>>>sum((i * i for i inrange(1, 1001)))333833500# 换出括号会将列表推导更改为生成器表达式。当你知道要从序列中检索数据,但不需要同时访问所有数据的时候,生成器表达式非常适合。 # 生成器表达式返回生成器对象,而不是创建列表。该对象知道它在当前状态中的位置(例如,i = 49)并且仅在被要求时计算下一个值。 # 因此,当sum通过重复调用.__ next __()来迭代生成器对象时,生成器检查i等于多少,计算i * i,在内部递增i,并将正确的值返回到sum。该设计允许生成器用于大量数据序列,因为一次只有一个元素存在于内存中。
from pip._internal import mainmain.main(['install','第三方库名'])
命令行下面的参数都可以通过转换为列表的形式执行,例如:
from pip._internal import mainmain.main(['install','-r','requirements.txt'])
使用f-Strings格式化字符串
# f-strings支持使用字符串格式化迷你语言,以及强大的字符串插值。这些功能允许你添加变量甚至有效的Python表达式,并在添加到字符串之前在运行时对它们进行评估:>>>defget_name_and_decades(name,age):... returnf"My name is {name} and I'm {age /10:.5f} decades old."...>>>get_name_and_decades("Maria", 31)My name is Maria and I'm 3.10000 decades old.
set 和 frozenset 的实现也依赖散列表,但在它们的散列表里存放的只有元素的引用(就像在字典里只存放键而没有相应的值)。在 set 加入到 Python 之前,我们都是把字典加上无意义的值当作集合来用的。
这些特点总结如下。
集合里的元素必须是可散列的。
集合很消耗内存。
可以很高效地判断元素是否存在于某个集合。
元素的次序取决于被添加到集合里的次序。
往集合里添加元素,可能会改变集合里已有元素的次序。
>>>import random>>> all_words ="all the words in the world".split()>>>defget_random_word():... return random.choice(all_words)>>>defget_unique_words():... words =set()... for _ inrange(1000):... words.add(get_random_word())... return words>>>get_unique_words(){'world','all','the','words'}
使用字符串常量访问公共字符串组
# 可以使用is_upper(),它返回字符串中的所有字符是否都是大写字母:>>>import string>>>defis_upper(word):... for letter in word:... if letter notin string.ascii_uppercase:... returnFalse... returnTrue...>>>is_upper('Thanks Geir')False>>>is_upper('LOL')True# is_upper()迭代word中的字母,并检查字母是否为string.ascii_大写字母的一部分。如果你打印出string.ascii_大写,你会发现它只是一个字符串,该值设置为文本“ABCDEFGHIJKLMNOPQRSTUVWXYZ”。所有字符串常量都只是经常引用的字符串值的字符串。其中包括以下内容:string.ascii_lettersstring.ascii_uppercasestring.ascii_lowercasestring.digitsstring.hexdigitsstring.octdigitsstring.punctuationstring.printablestring.whitespace
在这些语句中使用 else 子句通常能让代码更易于阅读,而且能省去一些麻烦,不用设置控制标志或者添加额外的 if 语句。
# for else 是 Python 中特有的语法格式,else 中的代码在 for 循环遍历完所有元素之后执行# 如果for循环正常结束,else中语句执行。如果是break的,则不执行。for i in mylist:if i == theflag:breakprocess(i)else:raiseValueError("List argument missing terminal flag.")
# 方式一flag =Falsefor x in xx:if some condition: flag =Truebreakif flag:print'no break'
# 方式二for x in xx:if some condition:breakelse:print'no break'
# 判断质数/素数——我知道的最快的方法# https://blog.csdn.net/songyunli1111/article/details/78690447# Exampledefis_prime(n=20): is_p =Falsefor ii inrange(2if n>=2else1, int(math.sqrt(n))+1):if n%ii ==0:breakelse: is_p =Truereturn is_p# 或者直接写成defis_prime(n=20):for ii inrange(2if n>=2else1, int(math.sqrt(n))+1):if n%ii ==0:returnFalseelse:returnTrue# 获取n=50以内的素数列表import mathn =50data = [ii for ii inrange(n)]res = itertools.compress(data,[is_prime(da) for da in data])print([r for r in res])Out[30]: [0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
>>>assertmul(2, 3)==7,'This statement is wrong!!!!!!'Traceback (most recent call last): File "<stdin>", line 1,in<module>AssertionError: This statement is wrong!!!!!!