Python的高级特性

本文介绍了Python的高级特性,包括列表生成式、矩阵转秩、字典生成式、集合生成式、判断是否可for循环、生成器以及yield的使用。通过实例详细解释了如何运用这些特性来简化代码,提高效率,特别是对斐波那契数列和聊天机器人的实现进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一   列表生成式

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

mothed 1:

 li = []
 for r in range(2,11,2):    #[2,4,6,8,10]
        square = math.pi * r * r
        li.append(square)
 print(li)

但是看到:代码笨重, 这种类型建议改写为列表生成式

mothed 2:

列表生成式实现

可以看到一样的效果,但是列表生成式一行代码就搞定了

mothed 3:

列表生成式实现, 将要返回的操作抽象为一个函数

专门定义一个函数来计算圆的面积,再用列表生成式来一步生成列表

2) 找出1~10之间所有奇数, 并且返回一个列表, (所有的奇数转换为字符串)

3)  找出1~100之间所有奇数, 并且返回一个列表,(如果能被3整除, 返回该数的平方, 否则返回该数的三次方)

4) 给定一个列表li = [2,3,4,5,6,3,1,4,5](如果是偶数返回0, 如果是奇数返回1)

5)找出1~100之间所有的质数

质数:只能被1和本身整除的数, 就是质数

判断num是否为质数, 如果为质数, 返回True, 否则返回False

依次判断num能否被(2,num)整除,如果能被其中一个数整除,不是质数.
当循环结束, 都没有发现能被整除的数, 那么就是质数


6) 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
# [2,3,5,7]

-输入描述:输入包括一个整数n,(3 ≤ n < 1000)

- 输出描述:输出对数

- 示例1 :输入:10输出:2

二  矩阵转秩

实现矩阵转秩的两种方法:

1). 列表生成式
2). 内置函数zip

1)列表生成式:

print([[ row[columnIndex] for row in li] for columnIndex in range(5)]

columnIndex=0=====> 返回的是每一行的第0个索引值; [1,4,7]

以此类推

2)内置函数zip:

*li: 解包
zip:

1).打包函数, 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

2).如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

3). zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。

     如需展示列表,需手动 list() 转换。

三  字典生成式

1) 假设有20个学生,学生分数在60-100之间,筛选出成绩在90分以上的学生

1>  如果用以前的方法,代码量过于长了

import random

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

2>  现在用集合生成式的话,代码量就会减少许多

import random
stuInfo = {"westos"+ 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值调换

3) 大小写计数合并 : key值最终全部为小写

四  集合生成式

同列表一样,只是将[ ]变为了{  }

也同字典相同,只不过传的是一个参数

五  判断是否会for循环

导入 Iterable 来判断是否可以for 循环,如果可以,返回True,否则,为False

六  生成器

1)生成器最快实现的方式:通过列表生成式改写. 一边循环, 一边计算的机制

可以看到如果不next 输出的话,是不会有结果的,因为数据都在生成器里面,需要next 来进行输出

每 next 执行一次,就会算一次

八  yield

斐波那契数列:

指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,

610,987,1597,2584,4181,6765,10946,17711,28657,46368........

 yield:当函数中包含yield关键字, 返回值是一个生成器, 如果要执行函数内容.需要调用next方法, 或者for循环.

           运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,

           从上一次停止的yield处继续执行,遇到yield停止运行.
return: 遇到return函数执行结束;

九  生成器的原理

生成器fib( )执行的过程分析:
#       执行语句 f = fib(100) 时,并不会马上执行 fib() 函数的代码块,而是首先返回一个 iterable 对象(即生成器)!
#       在 for 循环语句执行时或者next(),才会执行 fib() 函数的代码块。
#       执行到语句 yield b 时,fib() 函数会返回一个迭代值,直到下次迭代前,
#       程序会回到 yield b 的下一条语句继续执行,然后再次回到 for 循环,如此迭代直到结束。
#       看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
# 由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,
# 从而节省内存空间。

def myfun():
    print('step1')
    yield  'yield1'
    print('step2')
    res = yield 'yield2'
    print('sheen',res)
    print('step3')
    yield 'yield3'
#1.函数中有yield,返回值是一个生成器
g = myfun()
print(g)
#2.生成器函数默认不执行函数内容,当有next(g)时,才会执行函数内容
#3. 执行函数时,遇到下一个yield停止。默认情况下不会显示yield后的语句内容
#next(g)           #停在yield这个关键字位置
print(next(g))    #print会显示yield 这一句后面的内容
#仅有next和print(next)---->都在同一个yield语句行

#4.如果要给生成器函数传值
#   1)必须有变量接收传递的值:res = yield 'yield2'
#   2) 通过g.send('') ---->‘send’会重复上一次'yield'语句
print(next(g))
g.send('hello')
#print(next(g))

十  生成器——实现迷你聊天机器人

def chat_robot():
    res=''
    while True:
        receive=yield  res
        if 'age' in receive:
            res='年龄保密'
        elif 'name' in receive:
            res='siri'
        elif 'hello' in receive:
            res='hello'
        else:
            res="i don't know what you say"
def main():
    Robot=chat_robot()
    next(Robot)
    while True:
        send_data=input('正义: ')
        if send_data == 'q' or send_data == 'bye':
            print('bye')
            break
        print(Robot.send(send_data))
main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值