说明
- 本笔记参考的Python3教程
- 笔记只是自己在学习过程中,查漏补缺的零星记录,建议自己系统学习教程
笔记
- 交互模式中,最近一个表达式的值赋会自动给变量
_
;
此变量(_)
对于用户是只读的;
不要尝试给它(_)
赋值,如果赋值,只会创建一个独立的同名局部变量,它会屏蔽了系统内置变量的魔术效果。
>>> 10/3
3.3333333333333335
>>> _
3.3333333333333335
>>> round(_, 2)
3.33
>>> _ = 1
>>> _
1
- 当字符串中有特殊字符时,不能使用单引号,需要使用双引号。
>>> 'don't'
File "<stdin>", line 1
'don't'
^
SyntaxError: invalid syntax
>>> "don't"
"don't"
- print()函数生成可读性更好的输出;
它会省去引号,并且打印转义后的特殊字符。
>>> s = 'first line\nsecond line'
>>> s
'first line\nsecond line'
>>> print(s)
first line
second line
- 带有
\
的字符串会被当作特殊字符处理,如果要使用原始字符串,方法:在字符串前加一个r
。
>>> print("C:\some\name")
C:\some
ame
>>> print(r"C:\some\name")
C:\some\name
- 字符串可以由加号
(+)
操作符连接成一个字符串,可以由星号(*)
表示重复。
>>> 'b' * 2 + 'c'
'bbc'
- 相邻的两个字符串文本会自动连接在一起;
它只用于两个字符串文本,不能用于字符串表达式。
>>> 'Py' 'thon'
'Python'
>>> a = 'Py'
>>> a 'thon'
File "<stdin>", line 1
a 'thon'
^
SyntaxError: invalid syntax
- 字符串支持:索引和切片
索引用于获得单个字符,切片可以获得一个子字符串;
切片包含起始的字符,不包含末尾的字符。即 s[:i] + s[i:] 永远等于 s。
>>> word = 'Python'
>>> word[:2] + word[2:]
'Python'
- 在迭代过程中修改迭代序列不安全,通常使用切割标识,迭代它的复本。
word_list = ['mac', 'linux', 'windows']
>>> for i in word_list[:]:
... if len(i) > 6:
... word_list.insert(len(word_list), i)
...
>>> word_list
['mac', 'linux', 'windows', 'windows']
- 迭代序列索引,通过索引获取序列元素,推荐使用函数。
enumerate()
>>> course
['This', 'course', 'is', 'to', 'learn', 'python']
>>> for i, element in enumerate(course):
... print(i, element)
...
0 This
1 course
2 is
3 to
4 learn
5 python
- 同时循环两个或更多的序列,推荐使用
zip()
函数整体打包。
>>> course = ['mac', 'python', 'linux']
>>> duration = [180, 200, 500]
>>> for c, d in zip(course, duration):
... print(f"What is the duration of the {c} course? It's {d} minutes.")
...
What is the duration of the mac course? It's 180 minutes.
What is the duration of the python course? It's 200 minutes.
What is the duration of the linux course? It's 500 minutes.
-
range()
函数返回的对象表现为一个列表,但事实上它并不是;
迭代时,为了节省空间,它并不真正构造列表,它是一个按序列返回连续项的对象,此类对象称为:可迭代对象,即适合作为那些期望从某些东西中获得连续项直到结束的函数或结构的一个参数。
>>> print(range(5))
range(0, 5)
>>> list(range(5))
[0, 1, 2, 3, 4]
- 定义一个生成指定边界的斐波那契数列的函数。
>>> def fib(n):
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a + b
... print() # 换行的作用
...
>>> fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
- 定义一个返回斐波那契数列数字列表的函数,而不是打印它。
>>> def fib(n):
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a)
... a, b = b, a + b
... return result
...
>>> fib(1000)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
- 定义的函数中,while True判断是无限循环,通常有break语句。没有break语句时,遇到return 或 抛出异常,也会停止程序运行。
>>> def ask_ok(entry, retries=4, promot='Yes or no, Please!'):
... while True:
... ok = input(entry)
... if ok in ('y', 'ye', 'yes'):
... return True
... if ok in ('n', 'no', 'nop', 'nope'):
... return False
... retries = retries - 1
... if retries < 0:
... raise OSError ('uncooperative user')
... print(prompt)
# 传入3个参数,输入了y,满足第一个if条件,结束程序返回了True
>>> ask_ok('Do you really want to quit?', 2, 'Come on, only yes or no!')
Do you really want to quit?y
True
# 传入3个参数,输入了3次都不正确,抛出了异常
>>> ask_ok('Do you really want to quit?', 2, 'Come on, only yes or no!')
Do you really want to quit?w
Come on, only yes or no!
Do you really want to quit?p
Come on, only yes or no!
Do you really want to quit?a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in ask_ok
OSError: uncooperative user
- NoneType是Python中的特殊类型,它只有一个取值None;
它不支持任何运算,也没有任何内建方法;
任何其他的数据类型比较是否相等时,永远返回false;
可以将None赋值给任何变量;
当函数没有显式return时,默认返回None值,即return None。
# 运算
>>> None + 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
# 判断是否相等
>>> None == False
False
>>> None == 1
False
# 赋值给变量
>>> a = None
>>> a == 1
False
# 定义函数时没有显示的return
>>> def non():
... print('ok')
...
>>> a = non()
ok
>>> type(a)
<class 'NoneType'>
>>> a == None
True
- 函数的默认参数,在函数定义作用域被解析,默认值是非可变对象时,只被赋值一次。
>>> i = 5
>>> def f(argv=i):
... print(argv)
...
>>> f() # 默认参数值为 i,传入了i = 5
5
>>> i = 6 # i 被重新赋了值
>>> f() # 但函数默认参数的值只被赋值一次
5
>>> f(6)
6
>>> f()
5
- 函数默认参数,默认值是可变对象时(list\dict),在后续调用过程中,如果默认参数不传入值,则会累积(前面)传给它的参数;
如果传入了参数则不会累积;
如果不需要累积,在函数中判断默认参数是否传入,如果没有传入,则将默认参数再次赋值。
# 多次调用,会累积前面的参数
>>> def func(a, L=[1000]):
... L.append(a)
... return L
...
>>> func(1) # 不传入默认参数L
[1000, 1]
>>> func(2) # 不传入默认参数L
[1000, 1, 2]
>>> func(3) # 不传入默认参数L
[1000, 1, 2, 3]
>>> func(4, L=[10]) # 传入默认参数L
[10, 4]
>>> func(5) # 不传入参数
[1000, 1, 2, 3, 5]
# 不累积前面的参数
>>> def func(a, L=[1000]):
... if L == [1000]: # 判断L是否传入值
... L = [1000]
... L.append(a)
... return L
...
>>> func(1)
[1000, 1]
>>> func(2)
[1000, 2]
- 函数可以通过关键字参数的形式来调用,形如
keyword = value
;
在函数调用中,关键字的参数必须跟随在位置参数的后面;
传递的所有关键字参数必须与函数接受的某个参数相匹配;
关键字参数的顺序并不重要;
任何参数都不可以多次赋值。
>>> def project(language, num=100):
... print('---The project number is',num)
... print('---This Language is ', language)
...
>>> project('python', 200) # 2 positional arguments
---The project number is 200
---This Language is python
>>> project('PHP', num = 500) # 1 positional, 1 keyword
---The project number is 500
---This Language is PHP
- 可变参数是参数列表中的最后一个,任何出现在 *args 后的参数,只能被用作关键字,而不是位置参数;
形如 **name
的参数,它接收一个字典,包含了所有未出现在形式参数列表中的关键字参数;
形如 *name
的参数,它接收一个元组,包含了所有没有出现在形式参数列表中的参数值;
*name
必须在 **name
之前出现。
>>> def concat(*args, sep='.'):
... return sep.join(args)
...
>>> concat('www', 'google', 'com')
'www.google.com'
- 参数列表的分拆:当传递的参数是一个列表,要调用的函数却接受分开一个个的参数值,此时需要把列表拆开;
函数调用时,在参数前加1个星号(*)
操作符可以自动把参数列表拆开;
关键字参数为字典时,在参数前加2个星号(**)
操作符自动分拆。
>>> list(range(3, 6))
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))
[3, 4, 5]
- lambda 形式可以从外部作用域引用变量
# 使用 lambda 表达式返回一个函数
>>> def make_incrmentor(n):
... return lambda x: x + n
...
>>> f = make_incrmentor(30)
>>> f(0)
30
>>> f(2)
32
- 文档字符串
第一行应该是关于对象用途的简介,以大写字母开头,以句号结尾;
如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔;
第一行之后的第一个非空行决定了整个文档的缩进格式。
>>> def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything!
... pass
>>> print(my_function.__doc__)
Do nothing, but document it.
No, really, it doesn't do anything.
- 嵌套的列表推导式:列表解析中的第一个表达式可以是任何表达式,包括列表解析。使用zip()函数也可以实现
>>> a = [[3, 2, 8], [9, 1, 4]]
>>> [[row[i] for row in a] for i in range(3)]
[[3, 9], [2, 1], [8, 4]]
>>> list(zip(*a))
[(3, 9), (2, 1), (8, 4)]
- 比较操作符:in、not in、is、is not;
逻辑操作符:and、or;
not具有最高的优先级,or 优先级最低;
所有的比较操作符具有相同的优先级;
比较操作符的优先级,低于所有的数值操作,高于所有的逻辑操作符;
逻辑操作符 and 和 or 也称作短路操作符:它们的参数从左向右解析,一旦结果可以确定就停止运行;
比较操作可以传递。
# a < b == c 等同于 (a < b) and (b == c)
>>> a = 3
>>> b = 5
>>> c = 5
>>> a < b == c
True
- sys模块内置于所有的 Python 解释器;
变量 sys.path
是解释器模块搜索路径的字符串列表。它由环境变量 PYTHONPATH初始化,如果没有设定 PYTHONPATH,就由内置的默认值初始化;
可以用标准的字符串操作修改它;
import sys
sys.path.append('/ufs/guido/lib/python')