最近在学习python3.6,发现了很多之前新功能,而且很实用
然后之前也没用python写过一些之前C解决的小问题,最近在学习的时候也在练习把之前的小问题实现
汉诺塔问题
代码:
def move(n, a, b, c):
if n == 1:
print('move', a, '-->', c)
else :
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
思想:使用中间位置先暂时存放,先把a放到b,然后把下一个a移动到c,之后把b移动到c
杨辉三角问题
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 .....
代码:
def triangles(m):
L = [1]
n=1
while n<=m:
yield L
L = [L[x] + L[x+1] for x in range(len(L)-1)]#计算中间值
L.insert(0,1)#给头添加1
L.append(1)#给尾添加1
n+=1
思想:使用了python的generator和列表生成式,generator和函数的区别是,函数是按照代码顺序执行,遇到return或循环最后一行则退出;generator则是调用一次yield语句执行一次,停留到yield语句执行后的状态。
字符串转成浮点小数问题
代码:
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2float(s):
n = s.index('.')
num = 0
def fn(x, y):
return x * 10 + y
num += reduce(fn, map(char2num, s[:n]))
num += reduce(fn, map(char2num, s[n+1:]))/10**len(s[n+1:])
return num
思路:第一个函数使用字典将字符转化为整形,先使用index属性找到小数点所在的位置,然后分为两部分加,第一部分使用正常的reduce和map,第二部分则计算完后除以10的len(s[n+1:])次方,最后返回num即可
暂且就是这些,后面练习到了还会更新。