python3官方入门教程: https://docs.python.org/zh-cn/3/tutorial/index.html
字符串
- 字符串引号前添加 r 不会转义字符, r代表 raw
- 两个字面值(非变量)可以直接连接, 当然也可以用 + 连接
>>> s = 'C:\some\name'
>>> s
'C:\\some\name'
>>> print(s)
C:\some
ame
>>> s = r'C:\some\name'
>>> s
'C:\\some\\name'
>>> print(s)
C:\some\name
>>> s = 'Hello'"world"
>>> s
'Helloworld'
>>> s = 'Hello' " World"
>>> s
'Hello World'
for … else, while … else
循环语句支持 else 子句;
- for 循环中,可迭代对象中的元素全部循环完毕时,或 while 循环的条件为假时,执行该子句;
- break 语句终止循环时,不执行该子句。
- 与 if 语句相比,循环的 else 子句更像 try 的 else 子句: try 的 else 子句在未触发异常时执行,循环的 else 子句则在未运行 break 时执行。
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, '=', x, '*', n//x)
break
else:
# loop fell through without finding a factor
# for 遇到 break 跳出循环才执行 else
print(n, ' 是质数')
'''
2 是质数
3 是质数
4 = 2 * 2
5 是质数
6 = 2 * 3
7 是质数
8 = 2 * 4
9 = 3 * 3
'''
print('\n')
n = 2
while n < 10:
x =2
while x < n:
if n % x == 0:
print(n, '=', x, '*', n//x)
break
x+=1
else:
# loop fell through without finding a factor
# while 遇到 break 跳出循环才执行 else
print(n, ' 是质数')
n+=1
'''
2 是质数
3 是质数
4 = 2 * 2
5 是质数
6 = 2 * 3
7 是质数
8 = 2 * 4
9 = 3 * 3
'''
函数
函数在 执行时(非定义时) 使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;引用变量时:
- 首先,在局部符号表里查找变量,
- 然后,是外层函数局部符号表,
- 再是全局符号表,
- 最后是内置名称符号表。
函数也是一种对象, 其默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会出现与预想结果有差异的现象:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
'''
[1]
[1, 2]
[1, 2, 3]
'''
def f2(a, L=None):
# 不想在后续调用之间共享默认值时,应以如下方式编写函数
if L is None:
L = []
L.append(a)
return L
print(f2(1))
print(f2(2))
print(f2(3))
'''
[1]
[2]
[3]
'''
参数划分: /
和 *
是可选的。这些符号表明形参如何把参数值传递给函数:位置、位置或关键字、关键字。关键字形参也叫作命名形参。
/
和 *
将参数区域划分为三部分:
/
左侧全部为位置参数*
右侧全为关键字参数
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
----------- ---------- ----------
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
函数注解
函数注解 是可选的用户自定义函数类型的元数据完整信息(详见 PEP 3107 和 PEP 484 )。
标注 以字典的形式存放在函数的 __annotations__
属性中,并且不会影响函数的任何其他部分。 形参标注的定义方式是在形参名后加冒号,后面跟一个表达式,该表达式会被求值为标注的值。 返回值标注的定义方式是加组合符号 ->,后面跟一个表达式,该标注位于形参列表和表示 def 语句结束的冒号之间
问题是这注解并不能限定输入的参数类型啊.
def f(a:int, b:float = 0.0) -> float:
print("Annotations:", f.__annotations__)
print("Arguments:", a,b)
return a+b
print(f(1,2))
print(f('a','b'))
'''
Annotations: {'a': <class 'int'>, 'b': <class 'float'>, 'return': <class 'float'>}
Arguments: 1 2
3
Annotations: {'a': <class 'int'>, 'b': <class 'float'>, 'return': <class 'float'>}
Arguments: a b
ab
'''
数据结构
- 不是所有数据都可以排序或比较。例如,
[None, 'hello', 10]
就不可排序,因为整数不能与字符串对比,而 None 不能与其他类型对比。 - 有些类型根本就没有定义顺序关系,例如,3+4j < 5+7j 这种对比操作就是无效的。
同时循环两个或多个序列时,用 zip() 函数可以将其内的元素一一匹配
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
for x,y,z in zip(a,b,c):
print(x,y,z)
'''
1 4 7
2 5 8
3 6 9
'''
比较操作
- 比较操作支持链式操作。例如,
a < b == c
校验 a 是否小于 b,且 b 是否等于 c。 - 比较操作可以用布尔运算符 and 和 or 组合,并且,比较操作(或其他布尔运算)的结果都可以用 not 取反。这些操作符的优先级低于比较操作符
- not 的优先级最高,and次之, or 的优先级最低,因此,A and not B or C 等价于 (A and (not B)) or C。与其他运算符操作一样,此处也可以用圆括号表示想要的组合。
序列的比较:序列对象可以与相同序列类型的其他对象比较。这种比较使用 字典式 顺序
- 首先,比较前两个对应元素,如果不相等,则可确定比较结果;如果相等,则比较之后的两个元素,以此类推,直到其中一个序列结束。
- 如果要比较的两个元素本身是相同类型的序列,则递归地执行字典式顺序比较。如果两个序列中所有的对应元素都相等,则两个序列相等。
- 如果一个序列是另一个的初始子序列,则较短的序列可被视为较小(较少)的序列。
- 对于字符串来说,字典式顺序使用 Unicode 码位序号排序单个字符。
正文完