一、列表生成式
书写格式:
[experssion for i in 序列 if ...]
1. 生成一个列表,列表元素分别为[1**2,2**2,3**2......n**2]
常规做法:定义一个空列表,然后采用for循环,每循环一次添加一个元素到列表中。
# _*_ coding:utf-8 _*_
li = [] for i in range(1, int(raw_input()) + 1): li.append(i ** 2) print li
采用列表生成式:一条语句即可完成
# _*_ coding:utf-8 _*_
print [i ** 2 for i in range(1, int(raw_input()) + 1)]
结果如下:
2. 找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)
常规做法:
# _*_ coding:utf-8 _*_
import math
li = [] for r in range(2, 11, 2): square = math.pi * r * r li.append(square) print li
采用列表生成式:
# _*_ coding:utf-8 _*_
import math
print [math.pi * r * r for r in range(2, 11, 2)]
结果如下:
3. 找出1~100之间的所有质数
常规做法:
# _*_ coding:utf-8 _*_
li = [] for i in range(2, 101): for j in range(2, i): if i % j == 0: break else: li.append(i) print li
采用列表生成式:
# _*_ coding:utf-8 _*_
def isPrime(num): for i in range(2, num): if num % i == 0: return False else: return True
print [i for i in range(2, 101) if isPrime(i)]
结果如下:
总结:以上3个练习题均采用常规做法和列表生成式完成,得到的结果是完全一样的,但是常规做法的代码明显较多,
而列表生成式的代码则较少,代码明显更加的简洁,且可读性高,故在平常的开发中,应尽量使用列表生成式来生成
列表,使开发的代码更加简洁,可读和专业。
二、字典生成式
1. 假设有20个学生,数学成绩在60~100之间,筛选出成绩在90分以上的学生。
常规做法:首先定义一个字典用来存取接受到20个学生的姓名和成绩(成绩用随机数来生成),然后遍历字典,找出value值大于90的key-value存储到新的字典中。
# _*_ coding:utf-8 _*_
import random
stuInfo = {} for i in range(20): name = 'name' + str(i) score = random.randint(60, 100) stuInfo[name] = score # stuInfo['westos'+str(i)] = random.randint(60,100) hightscore = {} for name, score in stuInfo.items(): if score > 90: hightscore[name] = score print hightscore
字典生成式:只需要两行代码即可实现。
# _*_ coding:utf-8 _*_
import random
stuInfo = {'name' + str(i): random.randint(60, 100) for i in range(20)} print {name: score for name, score in stuInfo.items() if score > 90}
结果如下:由于成绩是由随机数生成器生成的,故两次结果是不一样的,但其实现的功能是一样的。
2. 将字典中的key对应value替换为大写的key
字典生成式:
d = {'a': 'apple', 'b': 'bob', 'c': 'cat'} print {k: k.upper() for k, v in d.items()}
结果如下:
3. 大小写合并,即将大写和小写的key对应的value合并,并且将key转化成小写
字典生成式:
d1 = {'A': 10, 'b': 3, 'a': 5, 'B': 8, 'd': 1} print {k.lower(): d1.get(k.upper(), 0) + d1.get(k.lower(), 0) for k, v in d1.items()}
结果如下:
总结:以上的练习题采用常规做法和生成式完成,得到的结果是完全一样的,但是常规做法的代码明显较多,而生成式的代码则较少,代码明显更加的简洁,且可读性高,故在平常的开发中,应尽量使用生成式来生成列表或者字典,使开发的代码更加简洁,可读和专业。
三、生成式练习
题目描述:给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10,程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7)),质数为[2,3,5,7]
输入描述:输入包括一个整数n,(3 ≤ n < 1000)
输出描述:输出对数
示例1:输入:10
输出:2
代码如下:
# _*_ coding:utf-8 _*_
def isPrime(num): for i in range(2,num): if num % i == 0: return False else: return True Num = int(raw_input()) primeLi =[i for i in range(2,Num) if isPrime(i)] print primeLi primePairCount = 0 """ 第一种思路: 1.先从列表中拿出两个数 2.判断这两个数之和是否等于Num """ for item1 in primeLi: for item2 in primeLi: if item1 + item2 == Num and item1 <= item2: primePairCount += 1 print primePairCount """ 第二种思路: 计算两个质数和是否等于输入的数,可将和化为差,即用输入的数减去得到的质数,结果若在所得到的列表里,则成立。 """ # [2,3,5,7] 2 === 10-2 3 ===10-3 5 ===10-5 7 ===10-7 for item1 in primeLi: if (Num - item1) in primeLi and item1 <= Num - item1: primePairCount +=1 print primePairCount
结果如下: