# usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- 2021/2/8 -*-
# 生成器
# 杨辉三角
def triangles():
s = [1]
i = 2
while True:
yield s # 相当于表示存储的值,但是是计算出来的
t = []
for j in range(i):
if j == 1 or j == i - 1:
t.append(1)
else:
t.append(s[j] + s[j - 1])
s = t
i = i + 1
result = []
n = 0
for x in triangles():
if n == 10:
break
print(x)
n = n + 1
# 递归
# 汉诺塔
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n - 1, a, c, b) # 把n-1个盘子借助c移到b
move(1, a, b, c) # 把剩下的一个盘子移到c
move(n - 1, b, a, c) # 把b上的n-1个盘子借助a移到c
# 切片
# 去空格
def trim(s):
while s[:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
# 列表生成
g = [x * x for x in range(1, 5)] # g=[1,4,9,16]
g = [x * x for x in range(1, 5) if x % 2 == 0] # g=[4,16] if在后面没有else,是为条件
g = [x if x % 2 == 0 else -x for x in range(1, 5)] # g=[-1,2,-3,4] if在前面要有else,是为选择
# 大写字母改为小写字母
s = ['Ajdi', 'dwi', 'sSDM', 12, 'DEQ']
g = [x.lower() if isinstance(x, str) else x for x in s] # g=['ajdi','dwi','ssdm',12,deq']
# -*- 2021/2/9 -*-
# map
def f(x):
return x * x
L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
S = map(f, L1)
print(L1, list(S))
r=list(map(str,L1)) # r = ['1','2','3','4','5','6','7','8','9']
# -*- 2021/2/17
# range:list/tuple/set/dict
#list
L=list(range(5)) # [0, 1, 2, 3, 4]
L.append(5) # [0, 1, 2, 3, 4, 5]
L.pop() #删除末尾
L.pop(i) #删除第i位
L[i]=value #第i位值变化,value可以是一个list,可以是数字,可以是字符串
L[:]=L[::]=L[::1] #步长为1 [0, 1, 2, 3, 4, 5]
L[::-1] #步长为-1 [5,4,3,2,1,0] 等于L[-1:0:-1]
L[:-1] #[0, 1, 2, 3, 4],为L[0:5]
#tuple 定义之后值不可更改 里面的值为list的部分可以修改
T=tuple(range(5)) # (0, 1, 2, 3, 4, ['X','Y'])
T[5][1]='x'
T[5][0]='y'
print(T) # (0, 1, 2, 3, 4, ['y','x'])
#dict
D={'Michale':89, 'Joe':98} #字典初始化赋值
D['key']='value' #增加字典
#set 与dict相比 只有key 没有value
S=set(range(5)) # {0, 1, 2, 3, 4}
# -*- 2021/2/19 -*-
#字符串
#格式化
print('%s,%s'%('Hello','World'))
#%2d:整数,占两位(02d%,占两位,空位补0) %.2f:浮点数,2位小数 %s:字符串 %x:16进制数
#f-string
s=(100*5+95*3)/8
m='xiao.ming'
print(f'{m} is a good student, his GPA is {s:.2f}')
s.split('.') #把字符串中的'.'去掉,分割为几个部分,['xiao','ming']
s='shan.shui.jian'
s.split('.',1) #['shan','shui.jian']
s.split('.',2) #['shan','shui','jian']
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
name = ['adam', 'LISA', 'barT']
def normalize(name):
result = name[0:1].upper() + name[1:].lower()
return result
print(list(map(normalize, name)))
#['Adam', 'Lisa', 'Bart']
def str2float(s):
t=s.split('.')
def fq(a,b):
return a+b
def str2num(s):
return DIGITS[s]
def fn(x,y):
return 10*x+y
temp=reduce(fq,t)
return reduce(fn,map(str2num,temp))/(10**len(t[1]))
cesh='123.456'
print(str2float(cesh))
#123.456(浮点数)
# -*- 2021/2/20 -*-
#filter()筛选函数
def fn_three():
n=1
while True:
yield n
n=n+1
t=filter(lambda x:x%3==0,fn_three()) #筛选出3的倍数的惰性序列
for n in t:
if n<17:
print(n)
else:
break
#得到结果[3,6,9,12,15]
#sorted()排序函数
lists=[12,-15,56,78,-22]
sorted(lists) #[-22, -15, 12, 56, 78]
sorted(lists,key=abs,reverse=True) #[78, 56, -22, -15, 12]
#闭包
def fun_sum(*args):
def sum1():
ax = 0
for n in args:
ax = ax + n
return ax
return sum1
f1 = fun_sum(1, 3, 5, 7, 9)
print(f1())
def createCounter():
i = 0
def counter():
nonlocal i # 用nonlocal声明一个变量i在上级函数中有定义
i = i + 1
return i
return counter
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
#<<<counterA==counterB
#False
#函数定义之参数问题
def temp(kind, *args, **kw):
print(kind)
for i in args:
print(i)
for i in kw:
print(i, ':', kw[i])
# kind 为一个元素,args为元组(非关键字参数),kw为字典(关键字参数)
# for example:
temp('I am a student',
'Ha Ha, I am a teacher!',
'You are very nice!',
Clite='Michale',
book='Jane',
HALLA='blie')
#得到结果
# I am a student
# Ha Ha, I am a teacher!
# You are very nice!
# Clite : Michale
# book : Jane
# HALLA : blie
#-*- 2021/2/21 -*-
#装饰器decorate
import time
import functools
def temp(func1):
@functools.wraps(func1) #作用是使传入的参数func1函数的函数名作用后不会改变为wrapper
def wrapper(*args, **kwargs):
print('this is a %s' % func1.__name__)
return func1(*args, **kwargs)
return wrapper
@temp
def temp2():
print('I know that!')
#结果
#this is a temp2
#I know that!
#偏函数
#简单总结functools.partial的作用就是:
#把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
import functools
int2=functools.partial(int,base=2) #int('455',base=16) 表示455为16进制数,转化为为10进制数
print(int2('1110')) #结果为14
#OOP面向对象编程
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s:%s' % (self.name, self.score))
lisa = Student('lisa', 89)
Bart = Student('Bart',99)
lisa.age=21 #可以只有添加某一个实例的属性,但不影响抽象的类
print(lisa.age) #21
print(Bart.age) #出错,Bart没有age这一属性
lisa.print_score() #lisa:89
#继承和多态
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
def run(self):
print('Cat is running')
class Stone(Animal):
pass
cat=Cat()
dog=Dog()
stone=Stone()
animal=Animal()
cat.run()
dog.run()
animal.run()
stone.run()
#类型查看 isinstance(dog,Dog)->True isinstance(123,str)->False isinstance(b'a',bytes)->True
# isinstance([1,2,3],(list,tuple)) 是否为list或者tuple
# dir(dog) 得到dog对象的所有属性和方法
# obj.__len__()等价于len(obj)
# 配合getattr()、setattr()以及hasattr()使用
# for example:
class MyObject(object):
def __init__(self):
self.x=9
def power(self):
return self.x * self.x
obj=MyObject()
hasattr(obj,'x') # 有属性x吗 True
hasattr(obj,'y') # 有属性y吗 Flase
setattr(obj,'y',19) #设置一个属性y
hasattr(obj,'y') # True
getattr(obj,'y') #获取属性y 等价于obj.y
#可以传入一个默认值default,如果不存在该属性,返回一个default
getattr(obj,'z',404) #不存在z属性,返回404
#也可以判断是否有某一方法
hasattr(obj,'power') #True
fn=getattr(obj,'power')
fn() # 81 等价于Obj.power()
#实例属性和类属性
class Student(object):
count = 0 # count是属于Student这个类的 实例属性
def __init__(self, name):
self.name = name #类属性
Student.count += 1 # 每创建一个实例,count的值就会加1
class Student(object):
__slots__ = ('name', 'age') #只允许实例添加name属性和age属性 注意:仅对当前类的实例有限制作用,对子类失效
#动态添加方法需要导入types模块的MethodType方法
from types import MethodType #可以为实例和类动态添加方法
class Student(object):
def __init__(self,name)
self.name=name
def set_age(self,age):
self.age=age
s=Student('Joe')
s.set_age=MethodType(set_age,s) # 为实例s添加方法set_age
s.set_age(21)
print(s.age) # 21
Student.set_age=MethodType(set_age,Student) # 为类Student添加方法
s.set_age(21)
print(s.age) # 21
raise ValueError('score must be an integer!') #提示错误
#把方法封装为一个属性,可以方便对数据的修改,又可以对输入的数据做一定的限制
class Student(object):
@property
def score(self):
return self._score
@score.setter #若不定义setter,只能读出,不能写入
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
s=Student()
s.score=90 # 对
s.score=999 #报错
# age为只读属性,birth为读写属性
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2021 - self._birth
s = Student()
s.birth = 2000
print(s.birth)
print(s.age)