$课程笔记
一.基本元素
变量
- 变量赋值:
a="hello world"
- 变量命名:
• 字母:a-z, A-Z, 其他语言的字母符号
• 数字:0-9 (不可以出现在首字符)
• 下划线:_ (可以单用) - 注意事项
• 在赋值时,变量即被创建,变量的值和类
型在赋值的时候被确定。
• 不需要声明(declaration)
• 变量名大小写敏感:A, a是不同的变量
• 变量可以被重新赋值
变量类型
- 数值类型
• 整数 Integers: 12 0 -12987 0123 0X1A2 10294L
大致相当于C语言的 ‘int’ 或 ‘long’
范围可以非常大(大致无限)
八进制数以“0” 开始 (0981 是非法的!)
十六进制以0X开始
• 浮点数Floating point: 12.03 1E1 -1.54E-21
相当于C语言的double
• 复数Complex numbers: 1+3J
语言原生支持
运算注意事项:
• 操作符和C语言类似,例如 +, -, /, , %
• 幂操作:**
• 优先级和括号的作用相似 - 逻辑类型
• 预定义值:True False
• 数值 0 认为是假,其他值认为是真
• 操作符:not, and, or
运算注意事项:
• 比较运算获得逻辑值,运算符: <, <=, >, >=,
==, != - 字符串类型
• 使用函数str, int, float等类型名进行转换
b=int(a)
c=flaot(a)
d=str(a)
• 字符串的拼接和整数乘法
a="hello"+"world"
b="hello"*2
语句
- 代码缩进
• Python语 语 言 的 行 前 空 白 是 有 语 法 意 义 的
• 在源文件中,应该统一采取一种缩进格式
缩进进4个空格 ( 推 荐 标 准 )
缩进2个空格
缩进1制表符(tab)
上述缩进不可以混用
• 连续处于相同缩进层次的语句构成一个语句块(Block) - 条件语句
if 条件:
elif 条件:
else:
- 循环语句(for)
• 循环语句for
• range(n)表明从0开始,到n-1(含)。
s = 0
for i in range(10): # 0,1,...9
s += i
print(s)
- 循环语句(while)
s = 0
i = 0
while s<10:
s += i
i += 1
print(s)
- 导入语句
三种写法:
from math import *
# use pi, cos, sin, ...
from math import cos, sin
# only use cos, sin
import math
# use math.cos, math.sin, ...
- 定义函数
• 用def定义函数,可以有参数和返回值
def double(x):
return x * 2
turtle库详解
python类型
类型
• 标量类型
—— 逻辑类型(bool)
—— 整数(int)、浮点数(float)、复数(complex)
—— 空 类型 型(None)
• 集合类型
—— 字符串(str)
—— 列表(list)
—— 字典(dict)
—— 元组(tuple)
—— 集合(set)
• 自定义类型
—— 类 class
数值类型
• 除法有两种:/, // 后者是整除
—— 7/3 = 2.3333333333333335
—— 7//3 = 2
—— 7.0 // 3.0 = 2.0
• 幂运算允许实数
—— 7 ** 2 = 49
—— 7 ** 0.5 = 2.6457513110645907
• 不同类型的数值运算就高不就低
—— int —— float —— complex
三元操作符
• 表达式
x if c else y
相当于
c? x : y
字符串
• 字符串的进阶操作
'p' in s
• 下标以0为开始
s[0] # index: offset 0
s[2:6] # slice: part of string
s[:6]
s[6:]
• 逆序的下标
s[-1]
s[-3:-1]
s[1:-1]
s[-3:]
• 步长:begin🔚step
s[::2]
s[1::3]
s[5:1::-1]
"live"[::-1]
不可修改类型 Immutable
• 数值类型、字符串类型是不可修改类型
—— 后续讲解的元组(tuple)类型也是不可修改类型
• 它们的值是常数,不可以修改
—— 我们并不能把“1”修改为“2”,把“abc”改为“def”;
—— 作为值,它的含义是确定的、不变的。
• 赋值语句(Assignment)是给这些常数的值赋予不同的名称
字符串方法
s = 'I love Python'
s.count('on') # 查找子串出现次数
s.find('ove') # 查找子串首见位置
s.replace('Python', 'C++') # 替换
three = '3'
three.isdigit() # 是否为数字字符?
列表
- 相关事项
• 表(或称为列表,广义表)是python最重要
和常用的容器类
• 由一系列有序排列的对象构成(Ordered
collection of objects)~ C语言的数组
• 异构(Heterogenous),一个列表可以包含
多种类型的对象。
r = [1, 2.0, 3, 5] # list的字面构造
r[1] # 正数下标自首部计数,首部为0
r[-1] # 负数下标自尾部计数,尾部为-1
r[1:3] # 前闭后开区间
w = r + [10, 19] # 连接
t = [0.0] * 10 # 重复
len(r)
- 列表操作
r = [[9, 8], 2.0, 3, 'word']
r[0:3] = [1, 2, 5, 6] # 修改片段
r[1:3] = [] # 删除元素
r[1:1] = [ 'new' ] # 赋值语句左右侧都是片段;等价于插入[1, 'new', 6, 'word']
r[len(r):] = [ 'last' ] # 在尾部插入[1, 'new', 6, 'word', 'last']
- 列表的方法
r.insert(0, 'f') # 在0位置增加新元素'f'
del r[0]
r.append(9) # 尾部增加元素
r.sort() # in-place 排序
r.reverse() # 逆序
- 判断两个变量是否指向同一对象
• 利用id函数,返回对象的唯一标志
• id(x) == id(y) 表明x和y实际上是同一对象
• x is y - 列表推导
[i for i in range(9)]
[i*2 for i in range(9)]
[i for i in range(100) if '4' not in str(i)]
• 补充
—— Python 一行语句过长,可以用 \ 续行
—— 若在括号(花方圆均可)内可以自由换行
字典
- 基本事项
• 字典是一种数据组织方式,它根据 key获得对应的value
• key称为键,key是无序的,或者说不关注其顺序。
• value称为值,可以是任意的对象。
• 字典也称为映射(mapping)、哈希(hash)表、查找表(lookup table)等。 - 字典操作
g = {'Tom': 'boy', 'Mary': 'girl'}
g['Tom'] # 以key为索引
g.has_key('Mary')
g['Jack'] = 'boy' # 增加键值对
del g['Tom'] # 删除键,删除键到值的绑定
h = {'Tom': 12, 'Mary': 'good'}
'Per' in h # 在键的集合中检测
h.get('Per', 'unknown') # 如果查找失败则返回缺省值
h.keys() # 由键组成的列表,顺序不确定
h.values() # 由值组成的列表,顺序不确定
h.items() # 顺序同上
len(h) # 键的数量
元组
- 注意事项
• 与list相同,但不可改变(immutable)
• 一旦创建,不可修改。(Once created, can’t be changed.)
t = (1, 3, 2)
t[1] # 3
(a, b, c) = t # 元组赋值
a, b, c # (1, 3, 2)
集合
- 注意事项
• 数学中的集合,无序,不重复(set)
• 去重的时候很有用
s = set()
s = {1, 2, 3}
s.add(4) # {1,2,3,4}
s.add(1) # {1,2,3,4}
t = {1,2}
# &交集,|并集 - 差集
s - t # {3,4}
容器间转换
• list, set, dict 作为类型名可以实现转换
—— list(“abc”) = [“a”, “b”, “c”]
—— set([1,2,2]) = {1,2}
Python语句
pass语句
• pass是一个(占位)空语句,不做任何事情
• 动因
—— python利用缩进表达语句块,如果语句块是空的,不写会有错;
—— 这种情况下,可以写上pass
for循环语句
• for可以遍历任意的容器
—— 对词典遍历的是keys()
• range(n)是一个内置函数,返回0~n-1的列表
• range(start, stop, step)
break语句
• 跳出最内层的循环
• python没有直接跳出外层循环的语法手段
—— 通常会借助额外的flag变量
—— 异常处理
continue语句
• 它结束当前迭代,并跳到下一次迭代开头。即跳过循环体中余下的语句,但不结束循环。
• 可以用等价的if语句描述
for/while-else语句
• 只要不是break跳出循环,就执行else语句
• 相比C语言减少一个flag变量
r = [1, 3, 10, 98, -2, 48]
for i in r:
if i < 0:
print('input contains negative value!')
break
else:
print('input is OK')
exec和eval
• 动态地编写Python代码,并将其作为语句进
行执行或作为表达式进行计算
• 函数exec将字符串作为代码执行
• eval计算用字符串表示的Python表达式的值,
并返回结果。
• 如下代码来创建一个Python计算器
assert断言语句
• 要求某些条件得到满足,否则将引发异常
• 确保程序的参数合理
• 对于不合理的情况,明确引发异常
异常处理
- 完整的异常处理
try:
1 / 0
except NameError:
print("Unknown variable") 出现异常时执行。。。
else:
print("That went well!") 没有出现异常时执行
finally:
print("Cleaning up.") 任何情况下都会执行
函数
• 函数名:规则与变量名相同
• 参数列表:调用函数时传递给它的值
—— 可以由零个,一个或者多个参数组成
—— 当有多个参数时,各个参数用逗号分隔
• 函数体:函数被调用时执行的代码
—— 由一个或多个语句组成
—— 在执行到末尾或return语句时退出函数
—— 返回结果
• 函数调用的形式
—— 函数名( 参数列表 )
• 形式参数(名):定义函数时,函数名后面圆括号中的变量。形参只在函数内部有效。
• 实际参数(值):调用函数时,函数名后面圆括号中的变量。
参数能否修改:总结
• 凡是Immutable类型的参数,传入的对象值不可能修改
• 对于Mutable类型的参数:
—— 若对形参进行赋值,并不能改变传入对象的值
—— 若对形参进行in-place的修改,则该修改也反应在传入的对象上
关键字参数的缺省值
• 可以设定一些参数的缺省值(默认值)
• 如果调用者没有提供,则使用缺失值
def hello(name, greeting="Hello"):
• 允许用户提供任意数量的参数
def sum_of_all(*values):
作用域
- 注意事项
• 如果没有局部变量和全局变量同名,可以直接读取全局变量。
• 如果有一个局部变量与待访问的全局变量同名,则无法直接访问全局变量,因为它被局部变量遮住了。
• 可以使用关键字 global(nonlocal)修饰变量名,表明和全局(外层)变量关联。
• Python的函数可以作为返回值
匿名函数
• lambda可以用来定义函数
pow2_a = lambda x: x*x
def pow2_b(x):
return x*x
两者功能相同
模块
• 对于稍微大型的程序,代码量较大,不宜
放在一个文件中
• 模块可以将代码分散在不同的文件
主模块
if __name__ == "__main__":
do_something()
文本处理
字符的分类
• 数字 digits 01234567890
• 字母 letter
大写ABCDEFGHIJKLMNOPQRSTUVWXYZ
小写 abcdefghijklmnopqrstuvwxyz
• 空白字符:空格,\t\n\r\v
• 对应Unicode,上述概念有一定拓展。
字符串对象方法
- capitalize() 字符串首字母大写
- lower() 转为小写
- upper() 转为大写
- find(s)/rfind(s) 正向/逆向查找子串s的出现位置
- count(s) 查找s出现的次数
- strip() 移除开始和结束的空白
- **lstrip()/rstrip()**移除开始/结束的空白
- replace(s, r) 将子串s替换为r(缺省为全替换,可以仅替换指定次数)
- isalpha()/isdigit() 是否是字母、数字等……
- isupper()/Islower() 是否大写小写等….
- startswith(s)/endswith(s) 是否以s作为字符串的开始或结尾
- s.split(sep) 将字符串sep作为分隔符,对字符串s进行分解,返回列表
- sep.join(parts) 将各部分用分隔符sep连接在一起
格式化
• 字符串的格式化有三种方法
• %, format, f-string
- % 操作符
用法: str % parameter_tuple
"the num