python高级特性

一、迭代

In [2]: from collections import Iterable  ##判断是否可迭代,需导入Iterable模块
In [3]: isinstance([1,2,3],Iterable)
Out[3]: True    ##可for循环遍里的数据类型,均可迭代
In [4]: isinstance((1,2,3),Iterable)
Out[4]: True
In [5]: isinstance({'a':1,'b':2},Iterable)
Out[5]: True
In [6]: isinstance('hello',Iterable)
Out[6]: True

二、列表生成器

1.生成10以内数的平方的列表
In [1]: [i**2 for i in range(10)] 
Out[1]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2.生成20以内4倍数的平方的列表
In [7]: def gener(num):
   ...:     return num%4==0
   ...:   ##函数,判断num是否为4的倍数

In [8]: [i**2 for i in range(20) if gener(i)]
Out[8]: [0, 16, 64, 144, 256]
3.练习:找出/etc下以.conf结尾的文件
In [10]: import os  ##导入os模块
In [11]: [filename for filename in os.listdir('/etc') if filename.endswith('.conf')]
Out[11]:   ##判断文件是否以'.conf'结尾
['resolv.conf',
 'idmapd.conf',
 'krb5.conf',
...
In [12]: [filename for filename in os.listdir('/etc') if filename.split('.')[-1]=='conf']
Out[12]:   ##对字符串分割,筛选conf文件
['resolv.conf',
 'idmapd.conf',
 'krb5.conf',
...
升级:把找出的文件转化成大写
In [13]: [filename.upper() for filename in os.listdir('/etc') if filename.endswith('.conf')]
Out[13]:   ##filename.upper()内置方法,转换大写
['RESOLV.CONF',
 'IDMAPD.CONF',
 'KRB5.CONF',
...
4.找出N(输入的正整数)以内符合和等于N的质数对

方法1:直接生成质数列表

N = int(input('please input an int:'))
count = 0
l = [1, 2]
for i in range(3, N):  ##判断是否为质数,并加入质数列表
    for n in range(2, i):
        if i % n == 0:
            break
    else:
        l.append(i)
for num in l:   ##判断是否质数对满足要求
    if N - num in l and num <= N - num:
        count += 1
print(count)

方法2:采用列表生成器

N = int(input('please input an int:'))
count = 0
def prime(x):  ##编写函数,判断是否为质数
    if x <= 0:
        return False
    elif x == 1 or x == 2:
        return True
    else:
        for num in range(2,x):
            if x % num == 0:
                return False
        else:
            return True
l=[i for i in range(N) if prime(i)]  ##列表生成器
for num in l:
    if N - num in l and num <= N - num:
        count += 1
print(count)

三、字典生成式

1.生成新的字典,要求key值变成大写,value值+1
service = {
    'http': 80,
    'mysql': 3306,
    'ssh': 22
}
print({k.upper(): v + 1 for k, v in service.items()})
print({v: k for k, v in service.items()})  ##key-value值互换
2.对原字典处理,大小写合并,并以小写形式输出

方法1:采用遍历的方式

d = dict(a=2, A=1, B=10, b=4, e=3)
new_d = {}
for k, v in d.items():
    k = k.lower()   ##将元素转换为小写
    if k in new_d:   ##加入新字典中,整合
        new_d[k] += v
    else:
        new_d[k] = v
print(new_d)

方法2:采用字典生成式:

##注意:get的用法,查询到返回对应value值,查不到,返回None;修改默认值为0
d = dict(a=2, A=1, B=10, b=4, e=3)
print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k in d})
3.集合生成式

找出字典中的偶数,并去重

d = dict(a=2, b=4, c=5, d=6, e=4)
print({v for k, v in d.items() if v % 2 == 0})

四、生成器

1.Generator:在循环的过程中,为了节省内存空间。在 Python 中,这种一边循环一边计算的机制
2.生成器的定义及调用 ##依次计算,只能从前往后
python3:

>>> g = ( i for i in range(3))
>>> g.__next__()
0
>>> g.__next__()
1
>>> g.__next__()
2
>>> g.__next__()  ##超出range报错
Traceback (most recent call last):
  File "<input>", line 1, in <module>

python2:

In [1]: g = (i for i in range(3))
In [2]: g.next()  ##调用方法不一样
Out[2]: 0
In [3]: g.next()
Out[3]: 1
In [4]: g.next()
Out[4]: 2
In [5]: g.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-5-d7e53364a9a7> in <module>()
----> 1 g.next()

StopIteration: 

3.for循环的底层原理:

g=(i for i in range(3))
while True:  ##当超出range范围时,停止
    try:
        print(g.__next__())
    except StopIteration:   ##异常处理机制
        break
4.斐波那契数列

def fib(max):
    a, b, count = 0, 1, 1
    while count <= max:
        # print(b)  ##直接打印
        yield b   ##yield关键字,直接转换成genarator类型
        a, b = b, a + b
        count += 1

# fib(8)   ##直接调用函数,打印时会显示生成器类型
g=fib(8)   ##定义生成器g
print(g.__next__())   ##依次计算斐波那契数列并输出
print(g.__next__())
yield原理:
  • 1.函数中有yield,返回生成器对象,当前不执行

  • 2.调用函数g._next_()时,遇到yield停止,输出yield后的值

  • 3.再次调用函数g._next_()时,从yield后执行

5.简易交互式聊天(最简级别)
def robot():  ##定义对话机器人robot函数
    responce = ''  ##输出值
    while True:
        received = yield responce   ##每次执行到yield时,输出response
        if 'name' in received:   ##识别输入的字符串
            responce = 'XXXL'  ##name关键字的返回结果
        elif 'age' in received:
            responce = 'guess~~~~~'  ##age关键字的返回结果
        elif 'phone' in received:
            responce = 'gun,gun fastly.....'  ##phone关键字的返回结果
        else:
            responce = 'YOU GET OUT! Right Now~~~~'


def main():  ##定义主函数
    Robot = robot()  ##定义生成器
    Robot.__next__()  ##跳过,直接进入yield前状态
    while True:  ##对话的死循环
        send_data = input('YOU>>:')  ##输入的信息
        if send_data == 'q':
            print("I'm tired....")
            break
        robot_data = Robot.send(send_data)  ##send发送,yield接受
        print('robot>>:', robot_data)

main()  ##调用函数,进入交互式问答界面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值