基本数据类型
列表:list
- list.append(obj) # 在列表末尾添加新的对象
- list.count(obj) # 统计某个元素在列表中出现的次数
- list.extend(seq) # 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
- list.index(obj) # 从列表中找出某个值第一个匹配项的索引位置
- list.insert(index, obj)# 将对象插入列表
- list.pop(obj=list[-1]) # 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
- list.remove(obj) # 移除列表中某个值的第一个匹配项
- list.reverse() # 反向列表中元素
- list.sort([func])# 对原列表进行排序
- list.clear() # 清空列表
- list.copy() # 复制列表
- list.copy() 涉及到python的拷贝问题,这是python的浅拷贝。那么顺便说下python的深浅拷贝:浅拷贝只是将容器内的元素的地址复制了一份,深拷贝是完全拷贝了一个副本。详细参考:https://www.jianshu.com/p/7ddbffbee055
字典:dict
- popitem() # 随机返回并删除字典中的一对键和值(一般删除末尾对)。
- key in dict # 如果键在字典dict里返回true,否则返回false
- radiansdict.copy() # 返回一个字典的浅复制
- radiansdict.keys() # 以列表返回一个字典所有的键
- radiansdict.items() # 以列表返回可遍历的(键, 值) 元组数组
- radiansdict.clear() # 删除字典内所有元素
- radiansdict.values() # 以列表返回字典中的所有值
- radiansdict.fromkeys() # 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
- radiansdict.update(dict2) # 把字典dict2的键/值对更新到dict里
- radiansdict.get(key, default=None) # 返回指定键的值,如果值不在字典中返回default值
- radiansdict.setdefault(key, default=None) # 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
- pop(key[,default]) # 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
- 补充字典排序:
dict1 = {'a': 2, 'e': 3, 'f': 8, 'd': 4}
list1 = sorted(dict1.items(), key=lambda x: x[1], reverse=True)
print(list1)
结果:[('f', 8), ('d', 4), ('e', 3), ('a', 2)]
详细参考:https://www.jianshu.com/p/e81243f6c6e7
字符串:str
- upper() # 转换字符串中的小写字母为大写。
- title() # 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())。
- lower() # 转换字符串中所有大写字符为小写。
- rstrip() # 删除字符串字符串末尾的空格.
- lstrip() # 截掉字符串左边的空格或指定字符。
- max(str) # 返回字符串 str 中最大的字母。
- min(str) # 返回字符串 str 中最小的字母。
- join(seq) # 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
...
整数:int
- bit_length() # 查询以二进制表示一个数字的值所需的位数
- int.from_bytes(bytes,byteorder) # 返回给定字节数组所表示的整数。
- int.to_bytes(length,byteorder) # 返回表示整数的字节数组。
元组:tuple
- len(tuple) # 计算元组元素个数。
- max(tuple) # 返回元组中元素最大值。
- min(tuple) # 返回元组中元素最小值。
- tuple(seq) # 将列表转换为元组。
集合:set
- set1 = set({1, 2, 'barry'}) # 创建集合
- set2 = {1, 2, 'barry'} # 创建集合
- add # 将元素添加到集合中。如果元素已经存在,这不起作用。
- del set1 # 删除集合- update # 迭代增加
- clear # 删除此集合中的所有元素
- remove # 删除一个元素
- pop # 随机删除一个元素
- issubset # 子集
- issuperset # 超集
- union # 并集。(| 或者 union)
- difference # 差集。(- 或者 difference)
- intersection # 交集。(& 或者 intersection)
- isdisjoint # 如果两个集合有一个空交点,则返回True
- intersection_update # 用它自己和另一个交集更新一个集合。
- difference_update # 删除另一个集合中本集合所拥有的所有元素
- symmetric_difference # 反交集。 (^ 或者 symmetric_difference)
浮点:float
- is_integer # 如果浮点数是整数,则返回True
collections:Python内建的一个集合模块,提供了许多有用的集合类。
- Counter # 是一个简单的计数器,例如,统计字符出现的个数:
- OrderedDict # 可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:
- deque # 是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
- defaultdict # 使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
- import collections
obj = collections.Counter('aabbccc')
print(obj)
结果:Counter({'c': 3, 'a': 2, 'b': 2})
可变与不可变
可变:list,dict
不可变:str, int,touple,float
函数
函数参数传递的是什么? 引用、内存地址
默认参数尽量避免使用可变数据类型
默认参数只会被执行一次:第一次调用函数时,默认参数被初始化为[],以后每次调用时都会使用已经初始化的[]。
def func(a, a1=[]): # 默认参数
a1.append(a)
print(a1)
func(1)
func(1)
func(1)
# 结果:
[1]
[1, 1]
[1, 1, 1]
闭包
def foo():
m, n=3, 5
def bar():
a=4
return m+n+a
return bar
>>>bar = foo()
>>>bar()
说明:
bar在foo函数的代码块中定义。我们称bar是foo的内部函数。
在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。
简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。
- 闭包的意义与应用: 延迟计算;
- 闭包的意义: 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
应用领域:延迟计算(原来我们是传参,现在我们是包起来)
装饰器就是闭包函数的一种应用场景
内置函数
map:
它接受两个参数,分别是函数和列表,这个函数分别作用于列表中每一个元素,把结果作为一个新的列表返回。
map(lambda x, y: x + y, [1, 2, 3, 4, 5], [2, 3, 45, 6, 7])
map(int, ['1', '2', '3'])
结果:[3,5,48,10,12]
[1,2,3]
reduce:
它也接受两个参数,分别是函数和列表,函数会对参数序列中元素进行累积
reduce(lambda x, y: x+y, [1,2,3,4,5])
结果:15
filter:
它也接受两个参数,分别是函数和列表,函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
>>>[1, 3, 5, 7, 9]
zip:
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
isinstance:
函数来判断一个对象是否是一个已知的类型,类似 type()。
语法:
isinstance(object, classinfo)
- object -- 实例对象。
- classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值:
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。。
应用示例:
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True
True
isinstance() 与 type()的区别
1. type() 不会认为子类是一种父类类型,不考虑继承关系。
2. isinstance() 会认为子类是一种父类类型,考虑继承关系。
# 如果要判断两个类型是否相同推荐使用 isinstance()。
示例:
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
用Python实现⼀个⼆分查找的函数 二分查找算法
简单的说,就是将一个列表先排序好,比如按照从小到大的顺序排列好,当给定一个数据,比如3,查找3在列表中的位置时,可以先找到列表中间的数li[middle]和3进行比较,当它比3小时,那么3一定是在列表的右边,反之,则3在列表的左边,比如它比3小,则下次就可以只比较[middle+1, end]的数,继续使用二分法,将它一分为二,直到找到3这个数返回或者列表全部遍历完成(3不在列表中)
优点:效率高,时间复杂度为O(logN);
缺点:数据要是有序的,顺序存储。
列表推导式list comprehension和生成器的优劣
- 列表推导式是将所有的值一次性加载到内存中
- 生成器是将列表推导式的[]改成(),不会将所有的值一次性加载到内存中,延迟计算,一次返回一个结果,
它不会一次生成所有的结果,这对大数据量处理,非常有用
- 生成器函数: 一个函数中包含了yield关键词,那么这个函数就不是普通的函数,是一个生成器函数
- 调用生成器函数,不会立马执行该函数里面的代码, 而是会返回一个 生成器对象