python初学之高级特性(包含练习题)

一、生成式1.什么是生成式?答:是指快速生成对象的公式。一般包括(列表生成式,集合生成式,字典生成式)。列表生成式:用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。 集合生成式:用来快速生成集合(set)。 字典生成式:用来快速生成字典(dir)。1.列表生成式:例如:要生成100个1-50之间的随机值1)最原...
摘要由CSDN通过智能技术生成

一、生成式

1.什么是生成式?

答:是指快速生成对象的公式。一般包括(列表生成式,集合生成式,字典生成式)。

  1. 列表生成式:用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
  2. 集合生成式:用来快速生成集合(set)。
  3. 字典生成式:用来快速生成字典(dir)。

1.列表生成式:

例如:生成100个1-50之间的随机值

1)最原始的办法:(定义列表)

import random
nums = []                    #定义一个空列表,用来装随机产生的随机数
for count in range(100):
    num = random.randint(1,50)
    nums.append(num)
print(nums)
print(len(nums))                 #可写可不写


#运行结果:
[39, 30, 30, 40, 48, 34, 39, 14, 11, 6, 47, 27, 35, 26, 6, 7, 37, 37, 18, 14, 40, 48, 4, 20, 18, 14, 4, 26, 12, 25, 12, 34, 22, 35, 45, 7, 14, 32, 47, 20, 17, 14, 14, 2, 3, 16, 40, 23, 17, 30, 44, 32, 38, 3, 28, 39, 29, 27, 34, 32, 1, 41, 39, 31, 15, 37, 33, 5, 5, 34, 50, 20, 42, 26, 2, 15, 50, 21, 26, 50, 13, 48, 13, 25, 22, 5, 19, 50, 49, 13, 17, 10, 38, 17, 9, 13, 19, 5, 31, 20]
100

2)用列表生成式:

import random
nums = [random.randint(1,50) for count in range(100)]            #列表生成式
print(nums)
print(len(nums))         #可写可不写


#运行结果:
[49, 37, 39, 9, 22, 22, 41, 40, 49, 15, 16, 38, 33, 11, 18, 14, 43, 43, 27, 50, 22, 40, 48, 5, 19, 48, 13, 25, 48, 32, 42, 39, 4, 35, 18, 48, 49, 27, 31, 10, 12, 19, 13, 42, 8, 35, 17, 17, 16, 30, 22, 46, 14, 16, 42, 25, 12, 44, 5, 45, 5, 23, 22, 45, 27, 20, 3, 49, 43, 12, 50, 40, 3, 5, 7, 32, 7, 42, 49, 45, 14, 4, 36, 47, 38, 11, 18, 29, 25, 3, 21, 33, 10, 1, 45, 37, 14, 35, 1, 21]
100

基于以上 两种方法,可以进一步生成其函数模块,可以直接调用函数的方法,如下:

1)循环方法的函数模块(def use_loop())
import random
def use_loop():           #定义use_loop()函数
    nums = []
    for count in range(100):
        num = random.randint(1,50)
        nums.append(num)
    return nums
print(use_loop())           #调用函数


#运行结果:
[6, 19, 3, 48, 5, 39, 4, 20, 48, 40, 36, 32, 31, 10, 17, 16, 40, 12, 6, 18, 4, 40, 9, 36, 1, 35, 14, 33, 6, 12, 45, 2, 40, 16, 10, 34, 21, 30, 12, 29, 40, 34, 38, 44, 32, 16, 37, 31, 15, 38, 8, 9, 31, 17, 47, 11, 37, 39, 6, 27, 11, 1, 8, 33, 32, 10, 29, 26, 25, 44, 47, 23, 36, 8, 33, 15, 36, 2, 4, 9, 41, 10, 46, 28, 13, 31, 29, 25, 40, 2, 21, 26, 27, 35, 33, 40, 10, 26, 13, 2]     

2)列表生成式的函数模块(use_list_expression())

import random
def use_list_expression():               #定义函数模块
    return [random.randint(1,50) for count in range (100)]
print(use_list_expression())            #调用函数

#运行结果:
[2, 24, 31, 21, 45, 19, 20, 38, 46, 9, 38, 14, 46, 40, 21, 31, 35, 37, 48, 5, 30, 35, 26, 35, 8, 24, 26, 5, 50, 15, 22, 49, 6, 2, 50, 28, 10, 41, 35, 25, 22, 5, 48, 38, 2, 14, 30, 35, 48, 3, 3, 48, 37, 4, 49, 20, 28, 39, 41, 28, 22, 6, 3, 29, 34, 38, 33, 50, 4, 38, 1, 4, 1, 12, 34, 41, 41, 28, 23, 20, 33, 26, 2, 40, 2, 49, 14, 17, 9, 15, 13, 34, 31, 17, 3, 36, 24, 37, 30, 46]

可见,使用生成式更加简洁,代码量也少了很多,对于以上两个函数模块,还可以进一步优化,可以使生成的数字量更加的灵活,如下:

1)循环方法的函数模块:

import random
def use_loop(count=100,start=0,end=50):
    nums = []
    for count in range(count):
        num = random.randint(start,end)
        nums.append(num)
    return nums
print(use_loop(count=10))           #调用函数,指定生成个数为10
print(use_loop(count=15))           #指定生成个数为15


#运行结果:
[45, 49, 9, 21, 10, 32, 5, 0, 36, 20]
[13, 11, 39, 34, 11, 21, 39, 10, 45, 20, 9, 4, 15, 25, 48]

2)列表生成式的函数模块:

import random
def use_list_expression(count=100,start=0,end=50):
    return [random.randint(1,50) for count in range(count)]
print(use_list_expression(count=8))
print(use_list_expression(count=14))

#运行结果:
[41, 1, 4, 5, 4, 27, 28, 23]
[28, 42, 14, 45, 35, 18, 2, 30, 14, 29, 42, 15, 20, 11]

可见,使用生成式快速又简洁,节省很多代码量。

2)集合生成式:

例如:生成100个1-200之间随机且不重复数值

import random
nums = {random.randint(1,200) for count in range(100)}    #其实就是把列表的方括号变成了花括号
print(nums)

#运行结果:
{1, 3, 5, 6, 7, 13, 14, 16, 19, 20, 22, 23, 25, 26, 27, 28, 29, 34, 38, 41, 44, 45, 46, 49, 52, 55, 57, 59, 64, 65, 67, 69, 72, 74, 75, 78, 82, 83, 87, 88, 89, 94, 95, 96, 99, 103, 110, 118, 124, 125, 128, 129, 132, 133, 138, 139, 140, 143, 144, 148, 150, 152, 156, 158, 159, 160, 162, 165, 168, 172, 173, 174, 176, 178, 184, 185, 190, 192, 194, 196, 199}

3)字典生成式:

例如:生成10个用户字典, key是用户名userx(x=1, 2, 3, ....), value是密码passwordx(x=1, 2, 3...)

import  pprint             #pprint模块只是为了打印结果更加的友好性
users_info = {'user' + str(x+1) : 'password'+ str(x+1) for x in range(10)}
pprint.pprint(users_info)


#运行结果:
{'user1': 'password1',
 'user10': 'password10',
 'user2': 'password2',
 'user3': 'password3',
 'user4': 'password4',
 'user5': 'password5',
 'user6': 'password6',
 'user7': 'password7',
 'user8': 'password8',
 'user9': 'password9'}

2、生成式语法格式

  1. 普通的语法格式:[exp for iter_var in iterable]
  2. 带过滤功能语法格式: [exp for iter_var in iterable if_exp]
  3. 循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B

例如:这里统一用列表生成式举例说明

1)普通的语法格式:([random.randint(start,end) for count in range (count)])

如:生成任意个数<=100个,1~50之间的随机数值(如20个)

import random
def use_list_expression(count=100,start=0,end=50):
    return [random.randint(start,end) for count in range (count)]
print(use_list_expression(count=20))


#运行结果:
[13, 38, 4, 12, 43, 35, 32, 24, 47, 34, 5, 49, 30, 49, 13, 3, 17, 12, 18, 10]

2)带过滤功能的语法格式:([num for num in range(start, end + 1) if num % div_num == 0])

如:找出1-100之间能被3整除的数值

def use_list_expression(start=1, end=100, div_num=3):
    """使用列表生成式实现需求"""
    return [num for num in range(start, end + 1) if num % div_num == 0]
print(use_list_expression())
#或者:
print(use_loop(div_num=50))       (1到100之间能被50整除的数)

#运行结果:
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
[50]

3)循环嵌套的语法格式:([item1+ item2 for item1 in 'abc' for item2 in '123'])

如:快速生成['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']

nums = [item1+ item2 for item1 in 'abc' for item2 in '123']
print(nums)

#运行结果:
['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']

3、生成式练习:

1). 求以r为半径的圆的面积和周长(r的范围从1到10)。
 
import math
def circle_example():
    S = lambda r: math.pi * pow(r,2)
    C = lambda r : 2 * math.pi * r
    return [(S(r), C(r)) for r in range(1, 11)]
print(circle_example())

#运行结果:
[(3.141592653589793, 6.283185307179586), (12.566370614359172, 12.566370614359172), (28.274333882308138, 18.84955592153876), (50.26548245743669, 25.132741228718345), (78.53981633974483, 31.41592653589793), (113.09733552923255, 37.69911184307752), (153.93804002589985, 43.982297150257104), (201.06192982974676, 50.26548245743669), (254.46900494077323, 56.548667764616276), (314.1592653589793, 62.83185307179586)]

2). 找出1~100之间所有的质数。

质数:指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。

def is_prime(num):
    """判断是否为质数,如果是质数,返回True,如果不是,返回False"""
    for i in range(2, num):
        if num % i == 0:
            return False
    else:
        return True

def find_prime():
    """找出1~100之间所有的质数"""
    return [num for num in range(1, 101) if is_prime(num)]

if __name__ == '__main__':
    result = find_prime()
print(result)

#运行结果:
[1, 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). 将字典的key值和value值调换。

def swap_key_value(dictObj):
    return {value: key for key, value in dictObj.items()}

if __name__ == '__main__':
    d = {
        'user1': 'passwd1',
        'user2': 'passwd2',
    }
    result = swap_key_value(d)
    print(result)

#运行结果:
{'passwd1': 'user1', 'passwd2': 'user2'}

4). 字典key值大小写计数合并 : 已知字典{'A':10, 'b':5, 'a':2}, 合并后为{'a':12, 'b':5} 注意: key值最终全部为小写.

dict = {'A':10, 'b':5, 'a':2}
d = {key.lower(): (dict.get(key.lower(), 0) + dict.get(key.upper(), 0)) for key, value in dict.items()}
print(d)

#运行结果:
{'a': 12, 'b': 5}

二、生成器  

1、什么是生成器?

答:Python,一边循环一边计算的机制,称为生成器:Generator

2、生成器应用场景?

性能限制需要用到 , 比如读取一个 10G 的文件 , 如果一次性将 10G 的文件加载到内存处理的话 (read方法 ), 内存肯定会溢出 ;
 
但使用生成器把读写交叉处理进行 , 比如使用 (readline readlines) 就可以在 循环读取的同时不断处理 , 这样就可以节省大量的内存空间 .
 

3、生成器的特点:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值