python的一些基本操作

python基础

  1. 可以用加\的方式作为转义字符来标识,如果字符串中有很多字符都需要转义,Python允许使用r’ ‘表示’ ‘内部的字符串默认不转义。如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用’’’…’’'的格式表示多行内容,比如:

print(’’’ line1
… line2
… line3’’’)
输出:line1
line2
line3

  1. 在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量(动态语言)。
  2. 对于单个字符的编码,python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符。
  3. Python的字符串类型为str,python对bytes类型的数据用带b前缀的单引号或双引号表示,例如:x = b’ABC’
  4. 以Unicode表示的str通过encode()方法可以编码为指定的bytes。纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes,要把bytes变为str,就需要用decode()方法。如果bytes中包含无法解码的字节,decode()方法会报错。如果bytes中只有一小部分无效的字节,可以传入errors='ignore’忽略错误的字节。len()函数可以用来计算str包含多少个字符,注意:是字符,如果换成bytes,len()函数就计算字节数。
  5. 使用Python内置函数:bin()、oct()、int()、hex()可实现进制转换。

list与tuple

  1. list表示形式是[];list是一个可变的有序表,可以用append()函数向list末尾追加元素;用insert(i,‘str’)将元素str插入到索引号为i的位置;用pop()函数可以删除list末尾的元素;若是删除指定位置的元素,用pop(i)的方法;要把某个元素替换成别的元素,可以直接赋值给对应的索引位置;list里面的元素的数据类型也可以不同,而且list元素也可以是另一个list。
  2. tuple表示形式是();tuple跟list很类似,但是tuple一旦初始化就不能修改。如果定义只有一个元素的tuple,需要注意:因为()既可以表示tuple,又可以表达数学公式中的小括号,就会产生歧义,因此,Python规定,这种情况下,按小括号进行计算,所以,只有一个元素的tuple定义时必须加一个逗号,来消除歧义,比如:t = (1,)

input、dict和set

  1. input()可以用来读取用户的输入,返回类型为str,可以使用int()函数将str变为int型。
  2. python内置了字典,使用键-值(key-value)存储,具有极快的查找速度,形式为{};一个key值只能对应一个value,多次对一个key放入value,后面的值会把前面的值冲掉;如果key不存在,dict会报错,可以用d.get()函数提前判断key是否存在。如果要删除一个key,使用pop(key)的方法,对应的value也会从dict中删除。需要注意:dict的key必须是不可变对象,这个通过key计算位置的方法称之为哈希算法(Hash)。
  3. set和dict类似,也是一组key的集合,但不存储value,要创建一个set,需要提供一个list作为输入集合:s = set([1, 2, 3]);在set中也不存在重复的key,可以用add(key)的方法添加元素到set中,可以通过remove(key)的方法删除元素。set可以看做数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。
  4. 牢记,list是可变对象,而str是不可变对象。

函数

  1. 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个别名,例如:a = abs a(-1)会返回1。
  2. 空函数:如果定义一个什么都不做的空函数,可以用pass语句,作用是可以用pass作为占位符,比如还没想好怎么写函数代码,就可以先放一个pass,让代码能运行起来。
  3. 数据类型的检查可以用内置函数isinstance()实现。
  4. Python函数本质上只能返回单一值,但是返回多个值似乎也没问题,是由于此时返回值是一个tuple,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是一个tuple。
  5. 函数参数:函数中有必选参数和默认参数,设置默认参数时需要注意:必选参数在前,默认参数在后;变化大的参数放在前面,变化小的放在后面,变化小的参数就可以作为默认参数。python函数在定义的时候,默认参数L的值就被计算出来了,每次调用该函数,如果改变了L的内容,那么下次调用时,默认参数的内容就变了,所以定义默认参数时,要牢记:默认参数必须指向不变对象。
  6. 定义可变参数时,只需要在参数前面加一个*号。
  7. 关键字参数:可变参数允许你传入0个或者任意个参数,这些可变参数在函数调用时自动组装为一个tuple,而关键字参数允许传入0个或者任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。关键字参数是定义时直接在末尾加**kw。还有一个命名关键字参数,与关键字参数*kw不同,命名关键字参数需要一个特殊的分隔符 *,*后面的参数被视为命名关键字参数(命名关键字:顾名思义,只接受固定名字的关键字参数)。
  8. python中,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
  9. 递归函数:在函数内部,如果一个函数在内部调用自身,那么这个函数就是递归函数。递归函数可能会存在调用栈溢出的问题,可以使用尾递归的方法解决这个问题,尾递归是指,在函数返回的时候,调用自身本身,并且return语句不能含有表达式。这样,编译器或解释器就可以报尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

高级特性

  1. 切片:切片可以提取list中特定范围的子列表。 tuple也可以使用切片操作,只是操作的结果任然是tuple。字符串也可以看成是一种list,每个元素就是一个字符,因此,字符串也可以用切片操作,只是操作的结果任然是字符串。
  2. 迭代:如果给定一个tuple或list,可以通过for循环来遍历这个list或tuple,这种遍历称之为迭代(iteration),在Python中,迭代是通过for … in 来完成的。无论有无下标,只要是可迭代对象,都可以迭代,比如字典:

d = {‘a’: 1, ‘b’: 2, ‘c’: 3}
for key in d:
print(key)
默认情况下,dict迭代的是key,如果要迭代value,可以用 for value in d.value(), 如果同时要迭代key和value,可以用 for k, v in d.items()。

  1. Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。
  2. 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。比如:

[x*x for x in range(1,11) if x % 2 == 0]
这个列表生成式可以创建一个1~11范围内数的平方的列表,并且筛选出仅偶数的平方。

  1. 生成器:Python中,这种一边循环一边计算的机制,称为生成器:generator,有很多方法创建generator
    (1)直接把列表生成式的[]改成(),就创建了一个generator,如果要打印出generator的每一个元素,可以通过next()函数获得generator的下一个返回值,如果没有更多元素时,抛出StopIteration错误
    (2)如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,一般只需要将print(x)变为 yield x就可以了。
    (3)用for循环调用generator时,发现拿不到generator的return语句的返回值,如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

g = fib(6)
while True:
try:
x = next(g)
print(‘g:’, x)
except StopIteration as e:
print(‘Generator return value:’, e.value)
break

高阶函数

  1. map()函数:map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

def f(x):
return x*x

r = map(f, [1, 2, 3, 4])
list®
返回 [1, 4, 9, 16]

  1. reduce()函数:reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素作累积运算:

reduce(f, [x1,x2, x3,x4]) = f(f(f(x1,x2), x3), x4)

  1. filter()函数用于过滤序列,和map不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。注意:filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数返回所有的结果并返回list。
  2. Python内置sorted()函数可以对list进行排序,sorted()是一个高阶函数,可以接收一个key函数实现自定义的排序,比如按绝对值大小排序:

sorted([32,5,9,-2,-13], key = abs)
[-2, 5,9, -13,32]
如果要进行反向排序,不需要改动key函数,可以传入第三个参数reverse = True

  1. “闭包”:如果一个函数将另外一个函数作为返回值,并且内部函数可以引用外部函数的变量和参数,当返回内部函数时,相关参数和变量都保存在返回的函数中,这种程序结构称之为“闭包”。返回闭包时需牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
  2. 匿名函数:当我们在传入函数时,有些时候不需要显式定义函数,直接传入匿名函数更方便,Python中,关键字lambda表示匿名函数,如 lambda x: x * x ,冒号前面的x表示函数参数,匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
  3. 偏函数:首先import functools,使用 functools.partial()函数可以创建一个偏函数,偏函数的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新的函数会更加简单。
  4. 模块:任何模块代码的第一个字符串都被视为模块的文档注释
  5. 作用域:在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在函数内部使用,在Python中,我们使用 _ 来区分,一般类似 _xxx, __xxx这样的变量,是非公开的(private),仅希望在模块内部使用,当然这里只是“不应该”,而不是“不能”,只是从编程习惯上,应该避免引用private函数或变量。

面向对象编程

  1. 面向对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须填写的属性强制填写进去,通过定义一个__init__方法,在创建实例的时候,就把name, score等属性绑上去:

class Student(object):
def init(self, name, score):
self.name = name
self.score = score
注意:__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自动把实例变量传进去。

  1. 访问限制:在class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部复杂的逻辑,但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性;如果要让内部属性不被外部访问,可以把属性的名称前加两个下划线__,在Python中,实例变量名如果以 __开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。通过访问限制的保护,代码更加鲁棒。
  2. 获取对象信息:基本类型都可以用type()函数来判断,不过对于class的继承关系来说,使用type()就很不方便,如果要判断class的类型,可以使用isinstance()函数。如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list;注意:类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度,在Python中,如果调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

len(‘ABC’)
3
‘ABC’.len()
3

  1. 错误处理:Python中也有一套try … except … finally …的错误处理机制,当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳到错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块。

参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/