python生成式

一、列表生成式

书写格式:

[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

结果如下:

猜你喜欢

转载自blog.csdn.net/oikinkl/article/details/82390963