Python 编程——生成式

一、列表生成式

列表生成式即 List Comprehensions,是 Python 内置的非常简单却强大的可以用来创建 list 的生成式。由于有时候循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list。

格式:把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把 list 创建出来

举个例子,要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 可以用 range(1, 11)

>>> range(1,11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成 [1x1, 2x2, 3x3, …, 10x10]

方法一:循环

>>> L = []
>>> for x in range(1,11):
...     L.append(x * x)
... 
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list
方法二:

>>> print([x * x for x in range(1,11)])
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
1.关于列表生成式的举例说明
01.列表生成式for 循环+if 判断

需求1:
筛选出1~11里面仅偶数的平方

方法一:

>>> li = []
>>> for i in range(1,11):
...     if i % 2 == 0:
...             li.append(i * i)
... 
>>> print(li)
[4, 16, 36, 64, 100]

方法二:

>>> print([ i * i for i in range(1,11) if i % 2 == 0])
[4, 16, 36, 64, 100]

需求2:
s1 =‘ABC’ s2=‘123’
要求最终显示:A1 A2 A3 B1 B2 B3 C1 C2 C3

方法一:

>>> s1 = 'ABC'
>>> s2 = '123'
>>> li = []
>>> for i in s1:
...     for j in s2:
...             li.append(i + j)
... 
>>> print(li)
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

方法二:

>>> print([i + j for i in 'ABC' for j in '123'])
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
02.列表生成式变形之 for 循环

需求1:
[
[1,2,3],
[4,5,6],
[7,8,9]
]

最终显示:
[1,2,3,4,5,6,7,8,9]

方法一:

>>> li = [[1,2,3],[4,5,6],[7,8,9]]
>>> resli = []
>>> for item1 in li:
...     for item2 in item1:
...             resli.append(item2)
... 
>>> print(resli)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

方法二:

>>> li = [[1,2,3],[4,5,6],[7,8,9]]
>>> print([ item2 for item1 in li for item2 in item1])
[1, 2, 3, 4, 5, 6, 7, 8, 9]

练习题:
1.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的园的面积)

方法一:

>>> import math
>>> li = []
>>> for r in range(2,11,2):
...     square = math.pi * r * r
...     li.append(square)
... 
>>> print(li)
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

方法二:

>>> import math
>>> print([math.pi * r *r for r in range(2,11,2)])
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

方法三:

>>> import math 
>>> def square(r):
...     res = math.pi * r * r
...     return res
... 
>>> print([square(r) for r in range(2,11,2)])
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

2.判断num是否是质数 如果是质数就返回True 否则返回False
提示:什么是质数:只能被1和本身整除的书就是质数

>>> 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)])
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

3.将列表的字符串的大写改成小写,不是字符串的就去掉

>>> li = ['hello','World',18,12.3,False,'Apple']
>>> print([s.lower() for s in li if isinstance(s,str)])
['hello', 'world', 'apple']

4.找出/var/log目录中,所有以.log结尾的文件名或者目录名

>>> import os
>>> print([filename for filename in os.listdir('/var/log') if filename.endswith('.log')])
['cloud-init.log', 'yum.log', 'boot.log', 'Xorg.0.log', 'pm-powersave.log']

(2018-腾讯-在线编程题)
-题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
#[2,3,5,7]
-输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
-输出描述:
输出对数
-示例1 :
输入:
10
输出:
2

num = int(input())

def isPrime(num):
    for i in range(2,num):
        if num % i == 0:
            return False
    else:
        return True

primeli = [i for i in range(2,num) if isPrime(i)]
print(primeli)

"""
1.先从列表中拿出两个数
2.判断两个数之和是否等于num
"""
#[2,3,5,7] # 2 10 -2 =8
primecount = 0

for item in primeli:
    if (num - item) in primeli and item <= num - item:  #避免重复;(3,7)与(7,3)同
        primecount += 1
print(primecount)

二、字典生成式

对一个存在的字典要进行更改,定一个新字典。

1.关于字典生成式的举例说明

需求1:假设有20个学生 学生分数在60~100之间,筛选出成绩在90分以上的学生
方法一:

import random
stuInfo = {}
for i in range(20):
    name = 'westos' + str(i)
    score = random.randint(60,100)
    stuInfo[name] = score
#print(stuInfo)

highscore = {}
for name,score in stuInfo.items():
    if score > 90:
        highscore[name] = score
print(highscore)

方法二:

import random

stuInfo = {}
for i in range(20):
    name = 'westos' + str(i)
    score = random.randint(60, 100)
    stuInfo[name] = score
#print(stuInfo)
print({name:score for name,score in stuInfo.items() if score >90})

需求2:将所有的key值变为大写

d = dict(a = 1,b = 2 )
print(d)
new_d = {}
for i in d:
    new_d[i.upper()] = d[i]
print('key转换为大写的字典:',new_d)
print({k.upper():v for k,v in d.items()})

需求3:大小写key值合并 统一以小写输出
方法一:

d = dict(a=1, b=2, c=2, B=9, A=10)
new_d = {}
for k,v in d.items():
    low_k = k.lower()
    if low_k not in new_d:
        new_d[low_k] = v
    else:
        new_d[low_k] += v
print(new_d)

方法二:

d = dict(a=1, b=2, c=2, B=9, A=10)
print({k.lower(): d.get(k.lower(), 0) + d.get(k.upper(), 0) for k in d})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值