变量与赋值
跟元组(tuple)有关:
用元组给多个变量赋值
>>> t = (1, 'a')
>>> x, y = t
>>> x
1
>>> y
'a'
交换变量的值
>>> x, y = y, x
>>> x
'a'
>>> y
1
跟列表(list)有关:
索引可以是负整数,li[-1]表示列表li最后一个整数,负数表示逆序。列表索引范围为 [-len(li), len(li)-1] 。
>>> li = [1, 'a', []]
>>> li[-1]
[]
可以用切片(slide)
>>> li[1:3] #index=1 到 index=3的子列表
['a', []]
>>> li[1:] # 等价于 li[1:len(li)]
['a', []]
>>> li[:2] # 等价于 li[0:2]
[1, 'a']
>>>
快速构造列表
li = [x for x in range(10)] # 用for循环生成列表
li = [x for x in range(10) if x >= 5] # 带有判断语句的构造语句
li = [i+j for i in range(5) for j in range(6) if i < j] # 嵌套循环
li = [[i+j for i in range(5)] for j in range(6)] # 生成二维数组
逻辑运算:
三元操作符
x = 1 if a < b else 10
若 a < b 则 x = 1,否则 x = 10
左右大小判断
a = 7
if 0 <= a <= 10:
print(a)
函数式编程
函数都有返回值,没有return语句的函数默认返回 None,表示没有值
函数内可以嵌套函数
>>> def func1():
... a = 0
... i = 1
... def func2(x):
... j = 10
... return i + x * j # 这里的函数可以用外部的变量 i
... print(func2(a))
...
>>> func1()
1
函数作为参数传递
>>> def func1():
... return 10
...
>>> def func2(f):
... print(f() + 1)
...
>>> func2(func1)
11
在python中内置了排序函数 sorted,可以通过help(sorted)查看其作用。sorted函数的第一个参数可以是列表类型,还有一个名为key的参数,传递一个函数,返回实际要排序的值,如下所示:
>>> li = [1, 4, 3, 2]
>>> def order(x):
... return -x
...
>>> sorted(li, key=order)
[4, 3, 2, 1]
这里key=order是用参数名的方式赋值(python支持这样的语法),可以看出实际排序的方式是变量的相反数。
注:
sorted是常用的排序函数,它还有一个参数是reverse,表示是否降序排序,默认是升序;
另外,列表类型也有一个排序函数,调用方式为 li.sort(key=None, reverse=False),与sorted差不多,只是sort直接作用于 li ,而sorted会生成一个新的列表,而不影响 li 的值
匿名 lambda 函数
有时候不希望专门为一个函数命名,可以用匿名函数,也叫 lambda 函数(原本 lambda 函数是计算机的前身,图灵是在 lambda 函数的基础上提出简易的计算机模型)。lambda 函数的语法:
第一,用 labmda 关键字表明这是一个lambda表达式
列出所有的函数参数,用逗号隔开例如 x, y, z
用冒号 : 分割函数参数和函数体,这个函数体是一条语句,带有返回值
>>> lambda x, y: x + y
at 0x00AE7A48>
>>> a = lambda x, y: x + y
>>> a(1, 20)
21
>>> a = lambda x, y: print("x + y =", x + y)
>>> a(1, 30)
x + y = 31
事实上上面的 print 语句也有返回值None,可以看下面的例子:
>>> a = lambda x, y: (print("x + y =", x + y), 20)
>>> a(2, 20)
x + y = 22
(None, 20) # 这样就可以看出了print的返回值
lambda函数示例:
>>> li = [-1, 2. -3, 4]
>>> li = [-1, 4, -2, 3]
>>> li.sort(key=lambda x: abs(x), reverse=False)
>>> li
[-1, -2, 3, 4]
类与继承
类的基本语法:
class A():
def __init__(self, x):
self.x = x # 变量名加上self.后表示属于类A的变量,可以在任意函数中加入,这是python与其它语言很大的区别
def printx(self): # 所有方法前面都要加一个self,表示属于A这个类
print(self.x)
a = A("abcdefg")
a.printx()
类的继承:
class B(A):
def __init__(self, x):
super().__init__(x) # 初始化父类
def printy(self, y):
print(y)
b = B("gfedcba")
b.printx()
b.printy("123454321")
所有的类默认(即不声明父类的情况)有一个object父类,object 原本就有一些方法(method,类中的函数的术语),可以通过 dir(A)查看
>>> class A():
... pass
...
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
这些函数有的调用方式是a.__class__();有的是dir(a),对应着__dir__方法。常用的__str__在使用 print 函数的时候会默认调用,打印print(a)实际上是打印print(str(a)),也可以写成print(a.__str__()):
>>> a = A()
>>> a.__class__
>>> a.__str__()
'<__main__.a object at>'
>>> a
>>> print(a)
>>> repr(a)
'<__main__.a object at>'
这些方法可以重载,例如:
>>> class A():
... def __init__(self):
... print('create A')
... def __str__(self):
... return 'I am A'
... def __class__(self):
... print('call A.__class__()')
...
>>> a = A()
create A
>>> a.__class__()
call A.__class__()
>>> print(a)
I am A
运算符重载
参考这篇博客:浅析运算符重载
迭代器
希望类可以用于for循环中,可以自己写一个__next__的方法,具体参考官方文档
生成器
生成器可以构造一个迭代器,只要在函数中使用 yield 关键字即可,如下:
>>> def reverse(data):
... for index in range(len(data)-1, -1, -1):
... yield data[index]
...
>>> for char in reverse('golf'):
... print(char)
...
f
l
o
g
yield 表示抛出一个值,然后等待下一次调用next(r),而 for 循环就是调用了next(r),具体看官方文档,示例如下:
>>> r = reverse('golf')
>>> next(r)
'f'
>>> next(r)
'l'