Python 学习笔记
0 IDEA设置
-
导入本地py文件时,模块下方出现红色波浪线时如何解决
- 进入设置,找到Console下的Python Console,勾选选项“Add source roots to PYTHONPAT”
- 在当前项目程序目录右键单击,然后“Mark Directory as”为“Sources Root”
1 Python 特点
-
Python是一种解释型语言,不需要编译和链接。
-
Python程序的书写是紧凑而易读的。
- 高级数据类型允许在一个表达式中表示复杂的操作;
- 代码块的划分是按照缩进而不是成对的花括号;
- 不需要预先定义变量或参数。
-
Python是“可扩展的”:
如果你知道怎么写C语言程序,就能很容易地给解释器添加新的内置函数或模块,不论是让关键的程序以最高速度运行,还是把Python程序链接到只提供预编译程序的库(比如硬件相关的图形库)。
2 Python 解释器
2.1 命令行常用输入
- 启动解释器
python3.7
- 结束命令 Ctrl-Z 或者 quit()
- 执行指令
python -c command [arg] ...
- 执行模块
python -m module [arg] ...
2.2 源文件的字符编码
- 默认编码:UTF-8
- 声明文件所使用的编码
文件的 第一 行要写成特殊的注释# -*- coding: encoding -*-
,其中 encoding 可以是 Python 支持的任意一种 codecs。
2.3 清屏命令
import os
os.system('cls')
2.4 python版本切换
# python2.7
py -2
# python3.7
py -3
3 Python 作为计算器使用
3.1 数字直接计算
-
以使用 ** 运算符来计算乘方
-
在交互模式下,上一次打印出来的表达式被赋值给变量 _。
-
单斜杠和双斜杠的区别
-
python中单斜杠返回float,就算参与运算的是整型也会返回float型
-
双斜杠表示地板除法,向下取整,至少有一方是浮点型时,返回类型是浮点型,但是依然是整数
>>> 1/3 0.3333333333333333 >>> 1.0/3 0.3333333333333333 >>> 1//3 0 >>> 1.0//3 0.0 >>> 1.0//3.0 0.0 >>> -2//3 # 向下取整 -1 >>> -2.0//3 -1.0
-
3.2 字符串
-
使用单引号('……'),双引号("……"):会输出引号
-
反斜杠 可以用来转义
-
print() 函数会生成可读性更强的输出,即略去两边的引号,并且打印出经过转义的特殊字符
- 如果你不希望前置了 的字符转义成特殊字符,可以使用 原始字符串 方式,在引号前添加 r 即可
- print字符串前面加 f 表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式
-
字符串字面值可以跨行连续输入。
一种方式是用三重引号:"""...""" 或 '''...'''。字符串中的回车换行会自动包含到字符串中,如果不想包含,在行尾添加一个 即可。
-
字符串可以用 + 进行连接(粘到一起),也可以用 * 进行重复
-
相邻的两个或多个 字符串字面值 (引号引起来的字符)将会自动连接到一起.
-
字符串是可以被 索引 (下标访问)的,第一个字符索引是 0,索引也可以用负数,这种会从右边开始数:
-
除了索引,字符串还支持 切片,切片的索引有默认值。获取子字符串:
word[0:2]
,word[:2]
,word[4:]
,word[-2:]
-
Python 中的字符串不能被修改,它们是 immutable 的
因此,向字符串的某个索引位置赋值会产生一个错误
-
内建函数 len() 返回一个字符串的长度
3.3 列表
-
列表也支持索引和切片
所有的切片操作都返回一个新列表,这个新列表包含所需要的元素。就是说,如下的切片会返回列表的一个新的(浅)拷贝:
-
与 immutable 的字符串不同, 列表是一个 mutable 类型,就是说,它自己的内容可以改变
-
append() 方法 添加新元素
3.2 走向编程的第一步
# Fibonacci series:
# the sum of two elements defines the next
a, b = 0, 1
while a < 10:
print(a)
a, b = b, a+b
-
第一行含有一个 多重赋值: 变量 a 和 b 同时得到了新值 0 和 1
-
while 循环只要它的条件(这里指: a < 10)保持为真就会一直执行
-
循环体 是 缩进的 :缩进是 Python 组织语句的方式。注意,在同一块语句中的每一行,都要缩进相同的长度。
-
交互式命令行里,当一个组合的语句输入时, 需要在最后敲一个空白行表示完成(因为语法分析器猜不出来你什么时候打的是最后一行)。
-
print() 函数将所有传进来的参数值打印出来。
- 字符串会打印不带引号的内容, 并且在参数项之间会插入一个空格, 这样你就可以很好的把东西格式化。
- 关键字参数 end 可以用来取消输出后面的换行
print(a, end=',')
4 流程控制工具
4.1 if 语句
关键字 'elif' 是 'else if' 的缩写,适合用于避免过多的缩进。
4.2 for 语句
-
Python 中的 for 语句是对任意序列进行迭代(例如列表或字符串),条目的迭代顺序与它们在序列中出现的顺序一致。
-
如果在循环内需要修改序列中的值(比如重复某些选中的元素),推荐你先拷贝一份副本(可利用切片
words[:]
)。
4.3 range() 函数
-
遍历一个数字序列
range(10)、range(5, 10)
-
range也可以以另一个数字开头,或者以指定的幅度增加(甚至是负数;有时这也被叫做 '步进')
range(0, 10, 3)
-
range() 所返回是 可迭代的对象 ,适合作为函数和结构体的参数,这些函数和结构体期望在迭代结束之前可以从中获取连续的元素。
4.4 break 和 continue 语句,以及循环中的 else 子句
循环语句可能带有一个 else 子句;它会在循环遍历完列表 (使用 for) 或是在条件变为假 (使用 while) 的时候被执行,但是不会在循环被 break 语句终止时被执行。
4.5 pass 语句
pass 语句什么也不做。
4.6 定义函数
Fibonacci 数列的函数:
def fib(n): # write Fibonacci series up to n
"""Print a Fibonacci series up to n."""
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
# Now call the function we just defined:
fib(2000)
-
关键字 def
-
函数体的第一个语句是函数的文档字符串或 docstring 。
-
函数的 执行 会引入一个用于函数局部变量的新符号表。
-
在函数被调用时,实际参数(实参)会被引入被调用函数的本地符号表中;
-
实参是通过 按值调用 传递的(其中 值 始终是对象 引用 而不是对象的值)。
-
函数定义会把函数名引入当前的符号表中。
4.7 函数定义的更多形式
-
参数默认值
-
最有用的形式是对一个或多个参数指定一个默认值。
-
重要警告: 默认值只会执行一次。默认值为可变对象(列表、字典以及大多数类实例)时,修改会导致后面调用的值改变。
-
-
关键字参数
使用形如 kwarg=value 的 关键字参数 来调用函数。
-
任意的参数列表
-
*name 参数表示零个或多个普通参数
-
**name 的形式参数时,它会接受一个字典(参见 映射类型 --- dict )字典中包含了所有除了与形式参数对应的其他关键字参数
-
*name 必须在出现在 **name 之前
-
-
解包参数列表
-
- 运算符编写函数调用以从列表或元组中解包参数
-
字典可以使用 ** 运算符来提供关键字参数
-
-
Lambda 表达式
用 lambda 关键字来创建一个小的匿名函数
return lambda x: x + n
4.8 文档字符串和函数标注
- 第一行应该是对象目的的简要概述 , 这一行应以大写字母开头,以句点结尾。
- 如果文档字符串中有更多行,则第二行应为空白,从而在视觉上将摘要与其余描述分开
__doc__
获取文档字符串- 函数标注 以字典的形式存放在函数的
__annotations__
属性
5 数据结构
5.1 列表的更多特性
-
列表作为栈使用“后进先出”:append(i),pop()
-
列表作为队列使用“先进先出”:因为所有的其他元素都必须移动一位,相当低效,使用 collections.deque替代
-
列表推导式:
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
-
嵌套的列表推导式:
[[row[i] for row in matrix] for i in range(4)]
5.2 del 语句
按索引移除一个元素、移除切片、清空整个列表、删除整个变量
5.3 元组和序列
- 元组是 immutable (不可变的),列表是 mutable (可变的)
- 元组在输出时总是被圆括号包围的,以便正确表示嵌套元组
- 输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)
5.4 集合
花括号或 set() 函数可以用来创建集合,集合也支持推导式形式
5.5 字典
- 空字典:{},相当于map
5.6 循环的技巧
-
当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出
-
当在序列中循环时,用 enumerate() 函数可以将索引位置和其对应的值同时取出
-
当同时在两个或更多序列中循环时,可以用 zip() 函数将其内元素一一匹配。
zip返回一个元组,其中第i个元素来自第i个可迭代参数
-
当逆向循环一个序列时,先正向定位序列,然后调用 reversed() 函数
-
如果要按某个指定顺序循环一个序列,可以用 sorted() 函数,它可以在不改动原序列的基础上返回一个新的排好序的序列
5.7 深入条件控制
-
while
和if
条件句中可以使用任意操作,而不仅仅是比较操作。 -
比较操作符
in
和not in
校验一个值是否在(或不在)一个序列里 。 -
操作符
is
和is not
比较两个对象是不是同一个对象,这只跟像列表这样的可变对象有关。 -
所有的比较操作符都有相同的优先级,且这个优先级比数值运算符低。
-
比较操作可以传递。
例如
a < b == c
会校验是否a
小于b
并且b
等于c
。 -
比较操作可以通过布尔运算符
and
和or
来组合,并且比较操作(或其他任何布尔运算)的结果都可以用not
来取反。- 这些操作符的优先级低于比较操作符
not
优先级最高,or
优先级最低 , 可以在这种式子里使用圆括号- 布尔运算符
and
和or
也被称为 短路 运算符:它们的参数从左至右解析,一旦可以确定结果解析就会停止。
注意 Python 与 C 不同,赋值操作不能发生在表达式内部。
6 模块
-
模块是一个包含Python定义和语句的文件
-
文件名就是模块名后跟文件后缀 .py
import fibo # 导入模块 fib = fibo.fib # 把模块赋值给一个局部变量 fib(500)
-
仅在模块 第一次 在 import 语句中被导入时才执行初始化
-
每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表
-
模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突
-
访问一个模块的全局变量,
modname.itemname
-
模块可以导入其它模块。习惯上但不要求把所有
import
语句放在模块(或脚本)的开头。被导入的模块名存放在调入模块的全局符号表中。import
语句有一个变体,它可以把名字从一个被调模块内直接导入到现模块的符号表里。例如:>>> from fibo import fib, fib2 # 这里只引入指定函数 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这并不会把被调模块名引入到局部变量表里(因此在这个例子里,模块
fibo
是未被定义的)
-
-
以脚本的方式执行模块
python fibo.py <arguments>
解析命令行的代码只有在当模块是以“main”文件的方式执行的时候才会运行,需要在模块末尾添加这些代码
if __name__ == "__main__": import sys fib(int(sys.argv[1]))
7 输入输出
-
格式化字符串字面值 f或F
-
yes_votes = 42_572_654 no_votes = 43_132_495 percentage = yes_votes / (yes_votes + no_votes) '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)