输出

r''表示''内部的字符串默认不转义

1
2
3
4
print('\\\t\\')
#\ \
print(r'\\\t\\')
#\\\t\\

'''...'''的格式表示多行内容

1
2
3
print('''line1
line2
line3''')

编码

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

%运算符用来格式化字符串,若字符串里面的%是一个普通字符的话,用%%来表示一个%

list的方法

  • append()
  • pop(index) //没有参数则删除最后一个元素
  • insert(index,element)

tuple

list和tuple是Python内置的有序集合,一个可变,一个不可变。根据需要来选择使用它们。

循环

range(): 可以生成一个整数序列,如range(5)生成0,1,2,3,4

dict(字典)

避免key不存在的错误

  • 用in判断key是否存在 'Thomas' in d

  • 二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

    d.get('thomas')或d.get('thomas',-1)

  • 要删除一个key,用pop(key)方法,对应的value也会从dict中删除

set

要创建一个set,需要提供一个list作为输入集合

1
2
3
4
>>> s = set([1,2,3])
>>> s
{1, 2, 3}
#传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的

重复的元素在set中会被自动过滤

  • add(key)可以添加元素到set中
  • remove(key) 删除元素

两个set可以做数学意义上的交集、并集等操作

1
2
3
4
5
6
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

函数

内置函数

https://docs.python.org/3/library/functions.html#built-in-functions

定义函数

定义函数时,需要确定函数名和参数个数;

1
2
3
4
5
def my_abs(x):
if(x>=0):
return x
else:
return -x

pass语句什么都不做,可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass

类型检查

如果有必要,可以先对参数的数据类型做检查;

数据类型检查可以用内置函数isinstance()实现:

raise语句用来抛出一个错误

1
2
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')

函数可以返回多个值,Python的函数返回多值其实就是返回一个tuple

参数
  • 默认参数必须指向不变对象

  • 可变参数`def calc(*numbers)

    可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

  • 关键字参数

    1
    2
    3
    4
    def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
    >>> person('Adam', 45, gender='M', job='Engineer')
    name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

    可以先组装出一个dict,然后把dict当做关键字参数传进去

    1
    2
    3
    >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
    >>> person('Jack', 24, **extra)
    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

高级特性

切片

L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。

倒数第一个元素的索引是-1

1
2
3
4
5
6
7
#创建一个0-99的数列
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
#前10个数,每两个取一个:
>>> L[:10:2]
[0, 2, 4, 6, 8]

tuple也可以用切片操作,只是操作的结果仍是tuple

字符串也可以用切片操作,只是操作结果仍是字符串

迭代

for ... in

  • 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

  • 如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断

    1
    2
    3
    >>> from collections import Iterable
    >>> isinstance('abc', Iterable) # str是否可迭代
    True
  • Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

    1
    2
    3
    4
    5
    >>> for i, value in enumerate(['A', 'B']):
    ... print(i, value)
    ...
    0 A
    1 B
列表生成式
  • 写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,即要生成[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],用 [x * x for x in range(1, 11)]

  • for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

    >>> [x * x for x in range(1, 11) if x % 2 == 0] 得到:[4, 16, 36, 64, 100]

  • 使用两层循环,可以生成全排列:

    >>> [m + n for m in 'ABC' for n in 'XYZ'] 得到 :['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

生成器

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator

g = (x * x for x in range(10))

  • 可以通过next()函数获得generator的下一个返回值next(g)
  • generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
  • generator也是可迭代对象,所以可以使用for循环
1
2
3
4
5
6
7
8
9
10
11
#杨辉三角
def triangles(n):
L = [1]
while n>0:
yield L
L.append(0)
L = [L[i-1] + L[i] for i in range(len(L))]
n = n-1
f = triangles(6)
for v in f:
print(v)
迭代器

可直接作用于for循环的数据类型有:

  • 集合数据类型:如list、tuple、dict、set、str等
  • 一类是generator,包括生成器和带yield的generator function

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

map/reduce

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

1
2
3
4
5
6
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]