练习题的一些心得
杨辉三角
杨辉三角求第m行第k个元素的时候,用组合数公式就可以直接求,在利用阶乘的时候注意,只需一个循环求最大的数的阶乘,就可以在中间求得小数的阶乘,而且要注意当两个小数相等的时候.
数字统计法
利用列表的时候,问题1,当第一个数找到后面与它相同的数字后怎么在以后的循环中跳过这个数字.可以把每个数字都表示成一种状态,0或者 1.怎么表示呢?
再添加一个相同长度的列表,全部为0.
字典
字典特性:可变,无序,key值不重复的
定义: dict = {} dic = dict() d3 = {1:32,2:55}
字典的key值必须是可hash类型.当重复时,后面的值覆盖前面的值.value可以是任何值.
字典定义时可以是列表内加二元元组,二元数组,二元集合,但是是二元集合的话,不确定哪个是key值.如d4 = dict([{4,6}]) 4和6不一定哪个值key值.
还可以 L1 = [1]
D1 = dict.fromkeys(range(10),L1)
!!!但是注意,当L1修改时,D1中的L1也会跟着变化.
另一种定义方法: d5 = dict(a=1,b=2)
dict类构造字典.dict.fromkeys(range(10),value)当不写value时,映射为none
字典查找,添加,修改
dict[key值] 如果key不存在,则报keyerrror错
dict[key] =value 字典重新赋值,当key不存在时,添加k-v对.
dict.get(key,number)返回key对应的值,如果key不存在,则返回number | 使用较多
dict.setdefault(key,value)返回key对应的值,如果key不存在,则返回value值,并且在字典中创建一个key:value的元素.
dict.update([others]) 更新字典,特性:添加,覆盖,就地修改.
后面只能跟一各字典,但是可以跟一个字典和k = v 的组合。如
dic = {"a":2,"v":3}
di = {}
di.update(zip(range(5),"abcde"),**dic)
print(di)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 'a': 2, 'v': 3}
dict.update((2,5)) dict.update(a=5) dict.update([2,5]) dict.update({2,5})
字典移除
dict.pop(key,value)弹出key对应的值并且移除该键值对。没有key则返回value.
dict.popitem(),随机弹出key:value
dict.clear()字典清除
del 删除,可以删除任何对和元素.
字典遍历
for i in dict.keys()和dict 都是遍历key值
dict.values() 遍历value.
item 即为k-v对.
dict.items()遍历k-v对.
for k,v in dict.items():各自返回k和v
python解析式,生成器
datetime模块
datetime类方法:today()和now()不同之处就在now精确到毫秒.
utcnow()格林威治时区时间.
timestamp()返回一个到毫秒的时间戳,格林威治时间1970年1月1日0点到现在的时间.
formtimestamp(timestamp,tz=None) 根据一个时间戳返回一个时间对象.
列表解析式
九九乘法表用列表解析式表示:
a = [print("{}*{}={:<{}}".format(j,i,i*j,1 if j == 1 else 2),end= "\n" \
if i == j else " ") for i in range(1,10) for j in range(1,i+1)]
当时遇到的问题1 只有用print函数才能控制输出格式.
2 如果不把列表解析式赋值给a,还会得到一个全部为空的列表,因为print默认返回值是空
列表解析式求id
import random
["{:0>4}.{}".format(i,"".join(random.choice("abcdefghijk\
lmnopqrstuvwxyz") for _ in range(10))) for i in range(1,101)]
对于这道题的一些思考:
join括号内的是一个生成器表达式,只是省略了一个(),最好标注上()或者[]来确定生成的解析式类型.
函数
内建函数:
issubclass()判断某类型是否是某个函数的子类.
divmod(x,y)等价于tuple(x//y,x%y)
chr()返回一个数值的字符
ord©返回字符对应的Unicode
sorted()排序
sorted(iterable,key,reverse=True or Flase) !!! 注意,立即返回一个列表
reverse() 返回一个翻转元素的迭代器.
枚举enumerate()迭代一个序列,返回序列和数值的二元组.
迭代器(可迭代对象的一种,惰性求值)
iter(iterable)生成迭代器.
拉链函数zip(*iterable)
将多个可迭代对象合并在一起,返回一个迭代器.
list(zip(range(10),range(10)))
[(0, 0),
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9)]
all(可迭代对象) 所有都为true结果为true.否则false
any(可迭代对象)只要有一个true就为true,否则false.
python函数
函数作用域
全局变量可以在函数内部使用,但是反过来则不行.
内部函数不可以被直接使用.
global
在函数内部global定义,可以对全局变量进行操作.
def kk():
global x
x = 10
x = x + 1
print(x)
kk()
print(x)
11
11
x = x + 1中的每一个x都不一样.第一个x指的是全局变量x.第二个x指的是内部定义的x
x = 10
def fo():
y = x + 1
print(y)
print(x)
fo()
print(x)
如果y改为x则会报错.
!!global使用原则
不用global,函数的作用就是为了封装,与外界隔离,所以不要去操作外部的变量.外部变量对函数来说可以使用,不可操作.如果要使用外部参数可以使用传参的方式.如下
x = 10
def fo(x):
x = x + 1
print(x)
fo(x)
print(x)
结果为:11 10
闭包
使用nonlocal对变量标记为不在本地作用域中.可以对外部变量进行操作.但是nonlocal不能对全局变量进行使用.