课程地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
感谢廖老师。
高级特性
生成器 generator
- 杨辉三角
杨辉三角定义如下:
把每一行看做一个list,试写一个generator,不断输出下一行的list。
def Sanjiao(max):
n = 1
if max == 0:
print ()
elif max == 1:
print (1)
else:
j = 1
L = []
while j <= max:
L.append([1]*j)
j = j +1
while n <= max-1:
i = 1
while i < n :
L[n][i]=(L[n-1][i]+L[n-1][i-1])
i = i+1
n = n +1
return L
def sanjiao(number):
if number == 0:
print()
else:
n =1
L, M =[[1],], [1]
yield M
while n < number :
M = [1]+[(L[n-1][i]+L[n-1][i-1]) for i in range(1, n)]+[1]
n = n +1
L.append(M)
yield M
return 'done'
函数式编程
##map/reduce
- 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam’, ‘LISA’, ‘barT’],输出:[‘Adam’, ‘Lisa’, ‘Bart’]:
def standlize(name):
Name = ''
Name = Name + name[1].upper() + name[2:].lower()
return Name
- Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:
def prod(l):
def prod_twonums(x,y):
return x*y
reduce(prod_twonums,l)
- 利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456:
def str2float(s):
def char2num(x):
DIGITS = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8': 8, '9':9}
return DIGITS[x]
def fn1(x,y):
return x*10+y
def fn2(x,y):
return x*0.1+y
i =0
while s[i] != '.':
i = i+1
s1=s[:i]
s2=s[i+1:][::-1]
float1= reduce(fn1,map(char2num,s1))
float2 = reduce(fn2,map(char2num,s2))/10
return float1+float2
装饰器
请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
# _*_ coding: utf-8 -*-
#
import functools
import time
def metric(func):
@functools.wraps(func)
def wrapper(*args, **kw):
start=time.clock()
s = func(*args)
elapsed = (time.clock() - start)
print('%s executed in %s ms' % (func.__name__, elapsed))
return s
return wrapper
@metric
def fast(x,y):
return x+y
@metric
def slow(x,y,z):
return x*y*z
IO编程
操作文件与目录
第一题:命令行里dir -l的作用是:
第二题:编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印相对路径。
-
要注意递归函数的用法
-
在手动输入路径时,遇到这样一个错误:
(unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
解决方法如下:unicode error -
拼接路径一定要用os.path.join()这个函数
import os
l = []
def f2(s):
return lambda p: s in p
def f1(rootDir,s):
for x in os.listdir(rootDir):
p = os.path.join(rootDir,x)
l.append(p)
if os.path.isdir(x):
f1(p)
return filter(f2(s),l)
for i in f1(r'C:\Users\lones\Desktop\Test','Python'):
print(i)
进程与线程
多进程
正则表达式
第一题:
import re
re_emailaddr = re.compile(r'^(\w[a-zA-Z.]+)(@)(\w[a-z]+)(.com)$')
def is_valid_email(addr):
if re_emailaddr.match(addr):
return True
else:
print('%s is a wrong email addr' % addr)
if name == 'main':
assert is_valid_email('[email protected]')
assert is_valid_email('[email protected]')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('[email protected]')
print('ok')
第二题:
扫描二维码关注公众号,回复:
4448867 查看本文章
import re
re_emailaddr = re.compile(r'^(.+)(@)(\w[a-z]+)(.\w{2,3})$')
def name_of_email(addr):
m = re_emailaddr.match(addr)
if m:
if '<' in m.group(1):
L = re.split(r'[>\<]',m.group(1))
return L[1]
else:
return m.group(1)
else:
print('%s is a wrong email addr' % addr)
if name == 'main':
assert name_of_email('<Tom Paris> [email protected]') == 'Tom Paris'
assert name_of_email('[email protected]') == 'tom'
print('ok')
常用内建模块
datetime
获取用户输入的日期和时间如2015-1-21 9:01:30,以及一个时区信息
如UTC+5:00,均是str,请编写一个函数将其转换为timestamp
-- coding:utf-8 --
import re
from datetime import datetime,timezone,timedelta
re_datetime = re.compile(r'^(\d{4})-(0[1-9]|1[0-2]|[1-9])-(0[1-9]|1[0-2]|2[0-9]|3[0-1]|[0-9])'
r'\s(0[0-9]|1[0-9]|2[0-3]|[0-9])'
r':(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])'
r':(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$')
re_timezone = re.compile(r'^(UTC)(+|-)([0-9]|0[0-9]|1[0-2]):(00)$')
def to_timestamp(dt_str,tz_str):
m = re_datetime.match(dt_str)
n = re_timezone.match(tz_str)
if m and n:
cdatetime = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
if(n[1] == '+'):
cdatetime = cdatetime + timedelta(hours = int(n[3]))
else:
cdatetime = cdatetime - timedelta(hours = int(n[3]))
return cdatetime.timestamp()
elif n and not m:
print('datetime is wrong')
elif not n and m:
print('timezone is wrong')
else:
print('both timezone and datetime are wrong')
t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
assert t1 == 1433121030.0
t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
assert t2 == 1433121030.0
print('ok')
struct
#-- coding:utf-8 --
import struct,base64
def bmp_info(data):
b = struct.unpack('<ccIIIIIIHH',data)
if b[0] == b'B' and b[1] == b'M':
return {'width':b[-4],'height':b[-3],'color':b[-1]}
else:
print('这不是一个位图')
if name == 'main':
with open(r'C:\Users\lones\Desktop\Test-16位.bmp', 'rb') as f:
bmp_data = f.read(30)
bi = bmp_info(bmp_data)
assert bi['width'] == 1152
assert bi['height'] == 648
assert bi['color'] == 4
print('ok')
itertools
# -*- coding: utf-8 -*-
import itertools
def pi(N):
#'计算pi的值'
# step 1:创建一个奇数序列:1,3,5,7,9
odd = itertools.count(1, 2)
# step 2:取该序列的前N项: 1,3,5,7,9,......,2*N-1
oddn = itertools.takewhile(lambda x : x <= 2*N-1, odd)
# step 3:添加正负号并用4除
oddnlist = list(oddn) # 将iterator oddn转换为一个list,否则计算oddn2的时候会有错误
oddn1 = map(lambda x : 4/x, filter(lambda x:(x+1)%4 !=0,oddnlist))
oddn2 = map(lambda x : -4/x, filter(lambda x:(x+1)%4 ==0,oddnlist))
return sum(oddn1)+sum(oddn2)
if __name__ == '__main__':
print(pi(10))
print(pi(100))
print(pi(1000))
print(pi(10000))
assert 3.04 < pi(10) < 3.05
assert 3.13 < pi(100) < 3.14
assert 3.140 < pi(1000) < 3.141
assert 3.1414 < pi(10000) < 3.1415
print('ok')
计算结果:
3.0418396189294024
3.131592903558553
3.1405926538397777
3.141492653590049
ok