https://www.liaoxuefeng.com/wiki/1016959663602400
1.字符串大小写变换
s.upper()字符串中字母由小写变为大写
s.lower()字符串中字母由大写变为小写
s.capitalize()字符串中字母首字母大写其余小写
s.title()字符串中字母每个单词的首字母大写其余小写
2.zip函数
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
3.find()函数
s.find(sub,start=0,end=len(S))
- sub--指定检索的字符串
- s-父字符串
- start-可选参数,查找字符起点,默认为0(可单独指定)
- end-可选参数,查找字符终点,默认为字符串的长度(不可单独指定)
返回值:返回字符串第一个匹配项出现在字符串中的索引位置。
4.pow()函数
math 模块 pow() 方法的语法:
pow(x, y[, z])
函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
注意:pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。
5.匿名lambda函数(包含map、reduce等函数应用)
https://blog.csdn.net/PY0312/article/details/88956795
6.strip()函数
str.strip([chars]);
strip()方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
7.next()函数
next(iterator[, default])
- iterator -- 可迭代对象
- default -- 可选,即返回值,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
8.列表反序
- list.reverse():Python 的 list.reverse() 方法,会直接在原来的列表里面将元素进行逆序排列,不需要创建新的副本用于存储结果。
- 使用切片 [::-1]:相比于第一种方式,这种方式会另外创建副本来保存列表的所有元素,所以需要更多的内存空间。并且,由于使用了切片的特性,导致在可读性上也不如之前的方式。但是这种方式没有改变原来的列表,在某些情况下算是一种优势。
- 使用 reversed() 方法:reversed 方法会将列表逆序的结果存储到迭代器里面,这种方式不会改变原来的列表,也不会创建原来列表的完整副本,只会多出迭代器对象所占的空间,相对来说也比较高效。【for item in reversed(list)】
9.nonlocal的用法
nonlocal语句允许内嵌函数修改定义在语法上位于外层的函数的作用域中的一个或者多个名称
用法:
nonlocal [变量名]
python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层。
具体步骤:当前作用域局部变量->外层作用域变量->再外层作用域变量->…->当前模块全局变量->pyhton内置变量
10.偏函数(Partial function)
当函数的参数个数太多,需要简化时,使用functools.partial
可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
11.python所有内置模块
https://docs.python.org/3/library/functions.html
12.获取对象信息
使用type()
使用isinstance():总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
使用dir():如果要获得一个对象的所有属性和方法,可以使用dir()
函数,它返回一个包含字符串的list。
只有在不知道对象信息的时候,我们才会去获取对象信息。
13.使用__slots__
Python允许在定义class的时候,定义一个特殊的__slots__
变量,来限制该class实例能添加的属性:
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
使用__slots__
要注意,__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。
14.使用@property
@property
广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2015 - self._birth
上面的birth
是可读写属性,而age
就是一个只读属性,因为age
可以根据birth
和当前时间计算出来。
15.多重继承
一个子类就可以同时获得多个父类的所有功能。
class Animal(object):
pass
class Mammal(Animal):
pass
class Bird(Animal):
pass
class Dog(Mammal, Runnable):
pass
class Bat(Mammal, Flyable):
pass
16.class中常见特殊用途的函数
Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。https://docs.python.org/3/reference/datamodel.html#special-method-names
- __str__:返回一个好看的字符串
- __iter__:如果一个类想被用于
for ... in
循环,就必须实现一个__iter__()
方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()
方法拿到循环的下一个值,直到遇到StopIteration
错误时退出循环。 -
__getitem__:要表现得像list那样按照下标取出元素,要正确实现一个
__getitem__()
还是有很多工作要做的。 -
__getattr__:动态返回一个属性。
-
__call__:任何类,只需要定义一个
__call__()
方法,就可以直接对实例进行调用。
17.metaclass元类
18.常见的错误类型和继承关系
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
19.利用logging进行debug
https://docs.python.org/2/howto/logging-cookbook.html
20.文档测试
import doctest
doctest.testmod()
21.读写
https://docs.python.org/3/library/functions.html#open
22.json
模块
https://docs.python.org/3/library/json.html#json
23.多进程
https://blog.csdn.net/qq_31362767/article/details/87474466
Windows下fork函数处理示例https://www.cnblogs.com/dbdd/p/10020690.html
24.ThreadLocal
一个ThreadLocal
变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal
解决了参数在一个线程中各个函数之间互相传递的问题。
25.正则表达式
在正则表达式中,如果直接给出字符,就是精确匹配,所以:
-
用
\d
可以匹配一个数字,\w
可以匹配一个字母或数字; -
要匹配变长的字符,用
*
表示任意个字符(包括0个),用+
表示至少一个字符,用?
表示0个或1个字符,用{n}
表示n个字符,s
可以匹配一个空格(也包括Tab等空白符),所以\s+
表示至少有一个空格用{n,m}
表示n-m个字符; -
[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线;[0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串;[a-zA-Z\_][0-9a-zA-Z\_]*
可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量; -
A|B
可以匹配A或B; -
^
表示行的开头,^\d
表示必须以数字开头; -
$
表示行的结束,\d$
表示必须以数字结束。
Python提供re
模块,包含所有正则表达式的功能。
https://docs.python.org/zh-cn/3/library/re.html#re.Match.re
26.datetime标准库
datetime
表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。
如果要存储datetime
,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
- 获取当前日期和时间:
from datetime import datetime
now = datetime.now() # 获取当前datetime
datetime
模块还包含一个datetime
类,通过from datetime import datetime
导入的才是datetime
这个类。如果仅导入import datetime
,则必须引用全名datetime.datetime
。
datetime.now()
返回当前日期和时间,其类型是datetime
。
- 获取指定日期和时间:
dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
- datetime转换为timestamp:
dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
dt.timestamp() # 把datetime转换为timestamp,直接调用
Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
- timestamp转换为datetime:
from datetime import datetime
t = 1429417200.0
print(datetime.fromtimestamp(t)) # 本地时间
print(datetime.utcfromtimestamp(t)) # UTC时间
本地时间是指当前操作系统设定的时区。timestamp也可以直接被转换到UTC标准时区的时间。
- str转换为datetime:
from datetime import datetime
cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
字符串'%Y-%m-%d %H:%M:%S'
规定了日期和时间部分的格式。https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
- datetime转换为str:
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
通过strftime()
实现,同样需要一个日期和时间的格式化字符串。
- datetime加减:
from datetime import datetime, timedelta
now = datetime.now()
now + timedelta(days=2, hours=12)
对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+
和-
运算符,不过需要导入timedelta
这个类。
- 本地时间转换为UTC时间:
from datetime import datetime, timedelta, timezone
tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
now = datetime.now()
dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
本地时间是指系统设定时区的时间,而UTC时间指UTC+0:00时区的时间。
一个datetime
类型有一个时区属性tzinfo
,但是默认为None
,所以无法区分这个datetime
到底是哪个时区,除非强行给datetime
设置一个时区。
- 时区转换:
# 拿到UTC时间,并强制设置时区为UTC+0:00:
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
# astimezone()将转换时区为北京时间:
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
# astimezone()将转换时区为东京时间:
tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
# astimezone()将bj_dt转换时区为东京时间:
tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
先通过utcnow()
拿到当前的UTC时间。
时区转换的关键在于,拿到一个datetime
时,要获知其正确的时区,然后强制设置时区,作为基准时间。利用带时区的datetime
,通过astimezone()
方法,可以转换到任意时区。
注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime
都可以正确转换,例如上述bj_dt
到tokyo_dt
的转换。
27.collections集合模块
- namedtuple:
namedtuple
是一个函数,它用来创建一个自定义的tuple
对象,并且规定了tuple
元素的个数,并可以用属性而不是索引来引用tuple
的某个元素。同时,创建的对象是tuple
的一种子类。
from collections import namedtuple
# namedtuple('名称', [属性list]):
Point = namedtuple('Point', ['x', 'y'])
Circle = namedtuple('Circle', ['x', 'y', 'r'])
- deque:因为
list
是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。同时,deque
除了实现list的append()
和pop()
外,还支持appendleft()
和popleft()
,这样就可以非常高效地往头部添加或删除元素。
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')#头部插入
defaultdict:使用dict
时,如果引用的Key不存在,就会抛出KeyError
。如果希望key不存在时,返回一个默认值,就可以用defaultdict。
除了在Key不存在时返回默认值,defaultdict
的其他行为跟dict
是完全一样的
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
注意默认值是调用函数返回的,而函数在创建defaultdict
对象时传入。
- OrderedDict:使用
dict
时,Key是无序的。如果要保持Key的顺序,可以用OrderedDict。
OrderedDict
的Key会按照插入的顺序排列,不是Key本身排序。
此外,OrderedDict
可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key。
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
- ChainMap:
ChainMap
可以把一组dict
串起来并组成一个逻辑上的dict
。ChainMap
本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。
什么时候使用ChainMap
最合适?举个例子:应用程序往往都需要传入参数,参数可以通过命令行传入,可以通过环境变量传入,还可以有默认参数。我们可以用ChainMap
实现参数的优先级查找,即先查命令行参数,如果没有传入,再查环境变量,如果没有,就使用默认参数。
下面的代码演示了如何查找user
和color
这两个参数:
from collections import ChainMap
import os, argparse
# 构造缺省参数:
defaults = {
'color': 'red',
'user': 'guest'
}
# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }
# 组合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)
# 打印参数:
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])
- Counter:
Counter
是一个简单的计数器,例如,统计字符出现的个数。Counter
实际上也是dict
的一个子类。
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
... c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
>>> c.update('hello') # 也可以一次性update
>>> c
Counter({'r': 2, 'o': 2, 'g': 2, 'm': 2, 'l': 2, 'p': 1, 'a': 1, 'i': 1, 'n': 1, 'h': 1, 'e': 1})