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
2
3
4
5
6
7
8
9
10

二、列表生成器
1.生成10以内数的平方的列表

In [1]: [i**2 for i in range(10)]
Out[1]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

1
2
3

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]

1
2
3
4
5
6
7

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’,

1
2
3
4
5
6
7
8
9
10
11
12
13
14

升级:把找出的文件转化成大写

In [13]: [filename.upper() for filename in os.listdir(‘/etc’) if filename.endswith(‘.conf’)]
Out[13]: ##filename.upper()内置方法,转换大写
[‘RESOLV.CONF’,
‘IDMAPD.CONF’,
‘KRB5.CONF’,

1
2
3
4
5
6

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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

三、字典生成式
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值互换

1
2
3
4
5
6
7

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)

1
2
3
4
5
6
7
8
9

方法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})

1
2
3

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
2

四、生成器

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 “”, line 1, in

1
2
3
4
5
6
7
8
9
10

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)
in ()
—-> 1 g.next()

StopIteration:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

3.for循环的底层原理:

g=(i for i in range(3))
while True: ##当超出range范围时,停止
try:
print(g.next())
except StopIteration: ##异常处理机制
break

1
2
3
4
5
6

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())

1
2
3
4
5
6
7
8
9
10
11
12
13

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() ##调用函数,进入交互式问答界面

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值