Python3笔记之查漏补缺

说明

  • 本笔记参考的Python3教程
  • 笔记只是自己在学习过程中,查漏补缺的零星记录,建议自己系统学习教程

笔记

  1. 交互模式中,最近一个表达式的值赋会自动给变量_
    此变量(_)对于用户是只读的;
    不要尝试给它(_)赋值,如果赋值,只会创建一个独立的同名局部变量,它会屏蔽了系统内置变量的魔术效果。
>>> 10/3
3.3333333333333335
>>> _
3.3333333333333335
>>> round(_, 2)
3.33
>>> _ = 1
>>> _
1


  1. 当字符串中有特殊字符时,不能使用单引号,需要使用双引号。
>>> 'don't'
  File "<stdin>", line 1
    'don't'
         ^
SyntaxError: invalid syntax

>>> "don't"
"don't"


  1. print()函数生成可读性更好的输出;
    它会省去引号,并且打印转义后的特殊字符。
>>> s = 'first line\nsecond line'
>>> s
'first line\nsecond line'

>>> print(s)
first line
second line


  1. 带有 \的字符串会被当作特殊字符处理,如果要使用原始字符串,方法:在字符串前加一个r
>>> print("C:\some\name")
C:\some
ame

>>> print(r"C:\some\name")
C:\some\name


  1. 字符串可以由加号(+)操作符连接成一个字符串,可以由星号(*)表示重复。
>>> 'b' * 2 + 'c'
'bbc'


  1. 相邻的两个字符串文本会自动连接在一起;
    它只用于两个字符串文本,不能用于字符串表达式。
>>> 'Py' 'thon'
'Python'

>>> a = 'Py'
>>> a 'thon'
  File "<stdin>", line 1
    a 'thon'
           ^
SyntaxError: invalid syntax


  1. 字符串支持:索引和切片
    索引用于获得单个字符,切片可以获得一个子字符串;
    切片包含起始的字符,不包含末尾的字符。即 s[:i] + s[i:] 永远等于 s。
>>> word = 'Python'
>>> word[:2] + word[2:]
'Python'


  1. 在迭代过程中修改迭代序列不安全,通常使用切割标识,迭代它的复本。
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']


  1. 迭代序列索引,通过索引获取序列元素,推荐使用函数。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


  1. 同时循环两个或更多的序列,推荐使用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.


  1. range()函数返回的对象表现为一个列表,但事实上它并不是;
    迭代时,为了节省空间,它并不真正构造列表,它是一个按序列返回连续项的对象,此类对象称为:可迭代对象,即适合作为那些期望从某些东西中获得连续项直到结束的函数或结构的一个参数。
>>> print(range(5))
range(0, 5)

>>> list(range(5))
[0, 1, 2, 3, 4]


  1. 定义一个生成指定边界的斐波那契数列的函数。
>>> 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 


  1. 定义一个返回斐波那契数列数字列表的函数,而不是打印它。
>>> 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]


  1. 定义的函数中,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


  1. 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


  1. 函数的默认参数,在函数定义作用域被解析,默认值是非可变对象时,只被赋值一次。
>>> i = 5
>>> def f(argv=i):
...     print(argv)
... 
>>> f()    # 默认参数值为 i,传入了i = 5
5
>>> i = 6    # i 被重新赋了值
>>> f()    # 但函数默认参数的值只被赋值一次
5
>>> f(6)
6
>>> f()
5


  1. 函数默认参数,默认值是可变对象时(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]


  1. 函数可以通过关键字参数的形式来调用,形如 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


  1. 可变参数是参数列表中的最后一个,任何出现在 *args 后的参数,只能被用作关键字,而不是位置参数;
    形如 **name 的参数,它接收一个字典,包含了所有未出现在形式参数列表中的关键字参数;
    形如 *name 的参数,它接收一个元组,包含了所有没有出现在形式参数列表中的参数值;
    *name 必须在 **name 之前出现。
>>> def concat(*args, sep='.'):
...     return sep.join(args)
... 
>>> concat('www', 'google', 'com')
'www.google.com'


  1. 参数列表的分拆:当传递的参数是一个列表,要调用的函数却接受分开一个个的参数值,此时需要把列表拆开;
    函数调用时,在参数前加1个星号(*) 操作符可以自动把参数列表拆开;
    关键字参数为字典时,在参数前加2个星号(**) 操作符自动分拆。
>>> list(range(3, 6))
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))
[3, 4, 5]


  1. lambda 形式可以从外部作用域引用变量
# 使用 lambda 表达式返回一个函数
>>> def make_incrmentor(n):
...     return lambda x: x + n
... 
>>> f = make_incrmentor(30)
>>> f(0)
30
>>> f(2)
32


  1. 文档字符串
    第一行应该是关于对象用途的简介,以大写字母开头,以句号结尾;
    如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔;
    第一行之后的第一个非空行决定了整个文档的缩进格式。
>>> 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.


  1. 嵌套的列表推导式:列表解析中的第一个表达式可以是任何表达式,包括列表解析。使用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)]


  1. 比较操作符: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


  1. sys模块内置于所有的 Python 解释器;
    变量 sys.path 是解释器模块搜索路径的字符串列表。它由环境变量 PYTHONPATH初始化,如果没有设定 PYTHONPATH,就由内置的默认值初始化;
    可以用标准的字符串操作修改它;
import sys
sys.path.append('/ufs/guido/lib/python')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容