(1+32)*(16%7)/7= 0.8571428571428571
(1+32)16%7/7=2.857142857142857
注:如果按照计算优先级顺序是先算在取余
# 行注释
'''
多行注释
'''
"""
多行注释
"""
#算术运算符
print(3//4) #整除 0
print(2**3) #幂 8
#逻辑运算符
print(not(2>1)) #非 Flase
#位运算符
print(~4) #按位取反 -5
print(4^5) #按位异或 1
print(4<<2) #左移 16 >>右移
#可使用三元运算符,一条语句完成判断和赋值
x, y = 4, 5
small = x if x < y else y
print(small) # 4
in | ‘A’ in [‘A’, ‘B’, ‘C’] #存在 |
---|---|
not in | 不存在 |
i s | “hello” is “hello” #是 |
not is | 不是 |
注意:is,is not 对比的是两个变量的内存地址,!=对比的是两个变量的类型
a = ["hello"]
b = ["hello"]
print(a is b, a == b) # False True
print(a is not b, a != b) # True False
运算符的优先级
1.使用变量之前,需要对其先赋值。
2.变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
3.Python变量名是大小写敏感的。
类型:int、float、bool
type(a) 查看数据类型
Python中万物皆对象
Python里面有很多用途广泛的包(package),用什么你就引进(import)什么。包也是对象,也可以用上面提到
的dir(decimal)来看其属性和方法。
除了直接给变量赋值True和False,还可以用bool(X)来创建变量,其中X可以是
1.基本类型:整型、浮点型、布尔型
2.容器类型:字符、元组、列表、字典和集合
1.获取类型信息
print(type(1)) #
print(isinstance(1, int)) # True
注:
1.type()不会认为子类是一种父类类型,不考虑继承关系。2.isinstance()会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用isinstance()。
1.转换为整型int(x,base=10)
2.转换为字符串str(object=’’)
3.转换为浮点型float(x)
语法:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
关键字:
sep是实现分隔符、end 是输出结束时的字符、file 是定义流输出的文件,可以是标准的系统输出 sys.stdout ,也可以重定义为别的文件、flush 是立即把内容输出到流文件,不作缓存。
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。
通过 << , >> 快速计算2的倍数问题。
n << 1 -> 计算 n*2
n >> 1 -> 计算 n/2,负奇数的运算不可用
n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
1 << n -> 2^n
if expression:
expr_true_suite
单个 if 语句中的 expression 条件表达式可以通过布尔操作符 and , or 和 not 实现多重条件判断。
if expression:
expr_true_suite
else
expr_false_suite
if 语句支持嵌套。Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意 else 的悬挂问题。
if expression1:
expr1_true_suite
elif expression2:
expr2_true_suite
.
.
elif expressionN:
exprN_true_suite
else:
expr_false_suite
elif==else if
assert 这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出 AssertionError 的异常。
在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
assert 3 > 7
# AssertionError
while 布尔表达式:
代码块
除了布尔表达式,还可以带运算符、非零整数,为0时,为假、str、list或任何序列,长度非零则视为真,否则为假。
while 布尔表达式:
代码块
else:
代码块
当 while 循环正常执行完的情况下,执行 else 输出,如果 while 循环中执行了跳出循环的语句,比如 break ,将不执行 else 代码块的内容。
for 迭代变量 in 可迭代对象:
代码块
for循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如 str、list、tuple 等,也可以遍历任何可迭代对象,如 dict 。
for 迭代变量 in 可迭代对象:
代码块
else:
代码块
当 for 循环正常执行完的情况下,执行 else 输出,如果 for 循环中执行了跳出循环的语句,比如 break ,将不执行 else 代码块的内容,与 while - else 语句一样。
range([start,] stop[, step=1])
enumerate(sequence, [start=0])
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons)) #默认从0开始
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1)) # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
例:与for 循环结合
for i, language in enumerate(languages, 2):
print(i, 'I love', language)
print('Done!')
'''
2 I love Python
3 I love R
4 I love Matlab
5 I love C++
Done!
列表推导式
[ expr for value in collection [if condition] ]
例:
a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
print(a)
# [(0, 2)]
元组推导式
( expr for value in collection [if condition] )
例:
a = (x for x in range(10))
print(a)
# at 0x0000025BE511CC48>
print(tuple(a))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
字典推导式
{ key_expr: value_expr for value in collection [if condition] }
例:
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}
集合推导式
{ expr for value in collection [if condition] }
例:
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}
Python标准异常总结
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
# 查询错误
try-except-else 语句尝试查询不在 dict 中的键值对,从而引发了异常。这一异常准确地说应属于 KeyError ,但由于 KeyError 是 LookupError 的子类,且将 LookupError 置于 KeyError 之前,因此程序优先执行该 except 代码块。所以,使用多个 except 代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
try:
s = 1 + '1'
int("abc")
f = open('test.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as error:
print('出错了!\n原因是:' + str(error))
# 出错了!
# 原因是:unsupported operand type(s) for +: 'int' and 'str'
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
不管 try 子句里面有没有发生异常, finally 子句都会执行。
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
如果在 try 子句执行时没有发生异常,Python将执行 else 语句后的语句。
else 语句的存在必须以 except 语句的存在为前提,在没有 except 语句的 try 语句中使用 else 语句,会引发
语法错误。
Python 使用 raise 语句抛出一个指定的异常。
简单数据类型
定义:列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, …, 元素n] 。
1、普通列表
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2、用range()创建列表
x = list(range(10))
print(x, type(x))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3、用推导式创建列表
x = [0] * 5
print(x, type(x))
# [0, 0, 0, 0, 0]
x = [0 for i in range(5)]
print(x, type(x))
# [0, 0, 0, 0, 0]
x = [i for i in range(10)]
print(x, type(x))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4、创建一个 4×3的二维数组
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
print(x, type(x))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
print(mix) # [1, 'lsgo', 3.14, [1, 2, 3]]
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.remove('Monday')
print(x) # ['Tuesday', 'Wednesday', 'Thursday', 'Friday']
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
y = x.pop()
print(y) # Friday
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del x[0:2]
print(x) # ['Wednesday', 'Thursday', 'Friday']
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用 del 语句;如果你要在删除元素后还能继续使用它,就使用方法 pop() 。
切片是Python序列的重要操作之一,除了适用于列表,还适用于元组、字符串、range对象。切片不仅可以截取列表中的任何部分返回一个新列表,还可以通过列表来增加、修改和删除列表中的部分元素。
list[start=0:stop=list.len:step=1]
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2) # [123, 456, 789, 213]
print(list3) # [123, 456, 789, 213]
list1.sort()
print(list2) # [123, 213, 456, 789] 改变
print(list3) # [123, 456, 789, 213] 不变
list1 = [123, 456]
list2 = [456, 123]
list3 = [123, 456]
print(list1 == list2) # False
print(list1 == list3) # True
list4 = list1 + list2 # extend()
print(list4) # [123, 456, 456, 123]
list5 = list3 * 3
print(list5) # [123, 456, 123, 456, 123, 456]
print(123 in list3) # True
( append , extend , insert )可对列表增加元素,它们没有返回值,是直接修改了原数据对象。将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。
方法 | 说明 |
---|---|
list.count(obj) | 返回某个元素在列表中出现的次数 |
list.index(x[, start[, end]]) | 返回列表中与某个值第一个匹配项的索引 |
list.reverse() | 原地逆序 |
list.sort(key=None, reverse=False) | 对原列表进行排序。(key 用来指定排序规则,reverse为Flase表示升序、 True表示降序默认),无返回值 |
list.append(x) | 将x就加到列表尾部 |
list.extend(L) | 将列表L中的所有元素追加至列表尾部 |
list.insert(index,x) | 在列表index位置插入x,该位置后所有元素后移,若index为整数且大于列表长度则在尾部追加,若为负数且小于列表长度的相反数则在头部插入元素 |
list.remove(x) | 从列表中删除第一个值为x的元素,且之后所有有元素前移,若不存在则抛出异常 |
list.pop([index=-1]) | 删除并返回列表中下标为index的元素,其后元素索引-1;若index不在区间则抛出异常 |
list.clear()删除列表所有元素,保留列表对象 | |
list.copy() | 返回列表的浅复制 |
copy.deepcopy(obj) | 返回深复制对象 |
浅复制:指生成一个新的列表,并把原列表中所有元素的引用都复制到新列表中。
深复制:指原列表中的元素进行递归,把所有的值都复制到新列表中,对嵌套的子列表不再是复制引用
定义:元组使用小括号,列表使用方括号
temp = (1,)
print(type(temp)) #
print(8 * (8)) # 64
print(8 * (8,)) # (8, 8, 8, 8, 8, 8, 8, 8)
#创建二维元组
nested = (1, 10.31, 'python'), ('data', 11)
print(nested)
# ((1, 10.31, 'python'), ('data', 11))
元组大小和内容都不可更改,因此只有 count 和 index 两种方法。
解压一维元组:有几个元素定义几个变量
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
# 1 10.31 python
解压二维元组(按照元组里的元组结构来定义变量)
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
# 1 10.31 OK python
用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c) # 1 2 5
print(rest) # [3, 4]
用通配符「*」加上下划线「_」
a, b, *_ = t
print(a, b) # 1 2
如果字符串中需要出现单引号或双引号,可以使用转义符号 \ 对字符串中的符号进行转义。
转义字符 | 描述 |
---|---|
\ \ | 反斜杠 |
\ ’ | 单引号 |
" | 双引号 |
\n | 换行 |
\t | 横向制表符(Tab) |
\r | 回车 |
原始字符串只需要在字符串前边加一个英文字母 r 即可。
print(r'C:\Program Files\Intel\Wifi\Help')
# C:\Program Files\Intel\Wifi\Help
python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
类似与元组,字符串具有不可修改性
方法 | 描述 |
---|---|
capitalize() | 将字符串的第一个字符转换为大写 |
lower() | 转换字符串中所有大写字符为小写 |
upper() | 转换字符串中的小写字母为大写 |
swapcase() | 将字符串中大写转换为小写,小写转换为大写 |
count(str, beg= 0,end=len(string)) | 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数。 |
endswith(suffix, beg=0, end=len(string)) | 检查字符串是否以指定子字符串 suffix 结束,如果是,返回True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。 |
startswith(substr, beg=0,end=len(string)) | 检查字符串是否以指定子字符串 substr 开头,如果是,返回True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。 |
find(str, beg=0, end=len(string)) | 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -1。 |
rfind(str, beg=0,end=len(string)) | 类似于 find() 函数,不过是从右边开始查找。 |
isnumeric() | 如果字符串中只包含数字字符,则返回 True,否则返回 False。 |
ljust(width[, fillchar]) | 返回一个原字符串左对齐,并使用 fillchar (默认空格)填充至长度 width 的新字符串。 |
rjust(width[, fillchar]) | 返回一个原字符串右对齐,并使用 fillchar (默认空格)填充至长度 width 的新字符串。 |
lstrip([chars]) | 截掉字符串左边的空格或指定字符。 |
rstrip([chars]) | 在字符串上执行 lstrip() 和 rstrip() |
replace(old, new [, max]) | 把 将字符串中的 old 替换成 new ,如果 max 指定,则替换不超过 max 次。 |
split(str="", [num]) | 不带参数默认是以空格为分隔符切片字符串,如果 num 参数有设置,则仅分隔 num 个子字符串,返回切片后的子字符串拼接的列表。 |
1、format 格式化函数
str = "{0} Love {1}".format('I', 'Lsgogroup') # 位置参数
print(str) # I Love Lsgogroup
str = "{a} Love {b}".format(a='I', b='Lsgogroup') # 关键字参数
print(str) # I Love Lsgogroup
str = "{0} Love {b}".format('I', b='Lsgogroup') # 位置参数要在关键字参数之前
print(str) # I Love Lsgogroup
str = '{0:.2f}{1}'.format(27.658, 'GB') # 保留小数点后两位
print(str) # 27.66GB
2、字符串格式化描述
符号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串,用str()方法处理对象 |
%d | 格式化整数 |
%o | 格式化无符号八进制数 |
%f | 格式化浮点数字,可指定小数点后的精度 |
print("我叫 %s 今年 %d 岁!" % ('小明', 10)) # 我叫 小明 今年 10 岁!
注意""%之间不要加逗号
定义:字典 是无序的 键:值( key:value )对集合,键必须是互不相同的(在同一个字典之内)。
{元素1, 元素2, ..., 元素n}
其中每一个元素是一个「键值对」-- 键:值 ( key:value )
创建
brand = ['李宁', '耐克', '阿迪达斯']
slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing']
print('耐克的口号是:', slogan[brand.index('耐克')])
# 耐克的口号是: Just do it
dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克'])
# 耐克的口号是: Just do it
dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3
print(dic)
# {'a': 1, 'b': 2, 'c': 3}
#这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误。
dic = dict(name='Tom', age=10)
print(dic) # {'name': 'Tom', 'age': 10}
print(type(dic)) #
方法 | 描述 |
---|---|
dict.fromkeys(seq[, value]) | 用于创建一个新字典,以序列 seq 中元素做字典的键, value 为字典所有键对应的初始值 |
dict.keys() | 返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键 |
dict.values() | 返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值 |
dict.items() | 以列表返回可遍历的 (键, 值) 元组数组 |
dict.get(key, default=None) | 返回指定键的值,如果值不在字典中返回默认值。 |
dict.pop(key[,default]) | 删除字典给定键 key 所对应的值,返回值为被删除的值。 key 值必须给出。若 key不存在,则返回 default 值 |
del dict[key] | 删除字典给定键 key 所对应的值 |
dict.popitem() | 随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常 |
dict.clear() | 用于删除字典内所有元素 |
dict.update(dict2) | 把字典参数 dict2 的 key:value 对 更新到字典 dict 里 |
python 中 set 与 dict 类似,也是一组 key 的集合,但不存储 value 。由于 key 不能重复,所以,在 set 中,没有重复的 key(key 为不可变类型,即可哈希的值)
1.先创建对象再加入元素。在创建空集合的时候只能使用 s = set() ,因为 s = {} 创建的是空字典。
basket = set()
basket.add('apple')
basket.add('banana')
print(basket) # {'banana', 'apple'}
2.直接把一堆元素用花括号括起来 {元素1, 元素2, …, 元素n} 。 重复元素在 set 中会被自动被过滤。
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # {'banana', 'apple', 'pear', 'orange'}
3.使用 set(value) 工厂函数,把列表或元组转换成集合。
a = set('abracadabra')
print(a)
# {'r', 'b', 'd', 'c', 'a'}
lst = [0, 1, 2, 3, 4, 5, 5, 3, 1]
temp = []
for item in lst:
if item not in temp:
temp.append(item)
print(temp) # [0, 1, 2, 3, 4, 5]
a = set(lst)
print(list(a)) # [0, 1, 2, 3, 4, 5]
集合特点:无序、唯一
由于 set 存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值,但是可以判断一个元素是否在集合中。
方法 | 描述 |
---|---|
set.add(elmnt) | 用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作 |
set.update(set) | 用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略 |
set.remove(item) | 用于移除集合中的指定元素。如果元素不存在,则会发生错误 |
set.discard(value) | 用于移除指定的集合元素。 remove() 方法在移除一个不存在的元素时会发生错误,而discard() 方法不会 |
set.pop() | 用于随机移除并返回一个元素 |
由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。
1.返回两个集合的交集:
Python 提供了不能改变元素的集合的实现版本,即不能增加或删除元素,类型名叫 frozenset 。需要注意的是 frozenset 仍然可以进行集合操作,只是不能用带有 update 的方法。
1、frozenset([iterable]) 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
函数名 | 描述 |
---|---|
list(sub) | 把一个可迭代对象转换为列表 |
tuple(sub) | 把一个可迭代对象转换为元组 |
str(obj) | 把obj对象转换为字符串 |
len(s) | 返回对象(字符、列表、元组等)长度或元素个数 |
max(sub) | 返回序列或者参数集合中的最大值 |
min(sub) | 返回序列或参数集合中的最小值 |
sum(iterable[, start=0]) | 返回序列 iterable 与可选参数 start 的总和 |
sorted(iterable, key=None, reverse=False) | 返回对所有可迭代的对象进行排序操作 |
reversed(seq) | 函数返回一个反转的迭代器 |
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
a = list(enumerate(seasons))
print(a)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
b = list(enumerate(seasons, 1))
print(b)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
for i, element in a:
print('{0},{1}'.format(i, element))
a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]
zipped = zip(a, b)
print(zipped) #
print(list(zipped)) # [(1, 4), (2, 5), (3, 6)]
zipped = zip(a, c)
print(list(zipped)) # [(1, 4), (2, 5), (3, 6)]
a1, a2 = zip(*zip(a, b))
print(list(a1)) # [1, 2, 3]
print(list(a2)) # [4, 5, 6]
def functionname(parameters):
"函数_文档字符串"
function_suite
return [expression]
Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态。
1、位置参数
2、默认参数
def functionname(arg1, arg2=v):
"函数_文档字符串"
function_suite
return [expression]
def functionname(arg1, arg2=v, *args):
"函数_文档字符串"
function_suite
return [expression]
def printinfo(arg1, *args):
print(arg1)
for var in args:
print(var)
printinfo(10) # 10
printinfo(70, 60, 50)
# 70
# 60
# 50
4、关键字参数
def functionname(arg1, arg2=v, *args, **kw):
"函数_文档字符串"
function_suite
return [expression]
**kw - 关键字参数,可以是从零个到任意个,自动组装成字典。
def printinfo(arg1, *args, **kwargs):
print(arg1)
print(args)
print(kwargs)
printinfo(70, 60, 50)
# 70
# (60, 50)
# {}
printinfo(70, 60, 50, a=1, b=2)
# 70
# (60, 50)
# {'a': 1, 'b': 2}
5、命名关键字参数
def functionname(arg1, arg2=v, *args, *, nkw, **kw):
"函数_文档字符串"
function_suite
return [expression]
def printinfo(arg1, *, nkw, **kwargs):
print(arg1)
print(nkw)
print(kwargs)
printinfo(70, nkw=10, a=1, b=2)
# 70
# 10
# {'a': 1, 'b': 2}
printinfo(70, 10, a=1, b=2)
# TypeError: printinfo() takes 1 positional argument but 2 were given
6、组合参数
在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
1、定义在函数内部的变量拥有局部作用域,该变量称为局部变量。
2、定义在函数外部的变量拥有全局作用域,该变量称为全局变量。
3、局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num) # 1
num = 123
print(num) # 123
fun1()
print(num) # 123
def funX(x):
def funY(y):
return x * y
return funY#闭包的返回值通常是函数。
如果要修改闭包作用域中的变量则需要 nonlocal 关键字。
一个函数在内部调用自身本身,这个函数就是递归函数。
例:斐波那契数列 f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1
def recur_fibo(n):
if n <= 1:
return n
return recur_fibo(n - 1) + recur_fibo(n - 2)
设置递归的层数,Python默认递归层数为 100
import sys
sys.setrecursionlimit(1000)
Python中两类函数:
lambda argumet_list:expression
a=lambda x:x+3
print(a)
print([a(x) for x in range(5)])
# at 0x00000000020A1E18>
#[3, 4, 5, 6, 7]
对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。
Python 的 self 相当于 C++ 的 this 指针
def __init__(self, name):
self.name = name
在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。
类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个。
实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。
类型工厂函数,指的是不通过类而是通过函数来创建对象
方法 | 描述 |
---|---|
add(self, other) | 定义加法的行为: + |
sub(self, other) | 定义减法的行为: - |
mul(self, other) | 定义乘法的行为: * |
truediv(self, other) | 定义真除法的行为: / |
floordiv(self, other) | 定义整数除法的行为: // |
mod(self, other) | 定义取模算法的行为: % |
divmod(self, other) | 定义当被 divmod() 调用时的行为 |
divmod(a, b) | 把除数和余数运算结果结合起来,返回一个包含商和余数的元组 (a // b, a % b) |
pow(self, other[, module]) | 定义当被 power() 调用或 ** 运算时的行为 |
lshift(self, other) | 定义按位左移位的行为: << |
rshift(self, other) | 定义按位右移位的行为: >> |
and(self, other) | 定义按位与操作的行为: & |
xor(self, other) | 定义按位异或操作的行为: ^ |
or(self, other) | 定义按位或操作的行为: |
方法 | 描述 |
---|---|
radd(self, other) | 定义加法的行为: + |
rsub(self, other) | 定义减法的行为: - |
rmul(self, other) | 定义乘法的行为: * |
rtruediv(self, other) | 定义真除法的行为: / |
rfloordiv(self, other) | 定义整数除法的行为: // |
rmod(self, other) | 定义取模算法的行为: % |
rdivmod(self, other) | 定义当被 divmod() 调用时的行为 |
rpow(self, other[, module]) | 定义当被 power() 调用或 ** 运算时的行为 |
rlshift(self, other) | 定义按位左移位的行为: << |
rrshift(self, other) | 定义按位右移位的行为: >> |
rand(self, other) | 定义按位与操作的行为: & |
rxor(self, other) | 定义按位异或操作的行为: ^ |
ror(self, other) | 定义按位或操作的行为: |
getattr , getattribute , setattr 和 delattr
getattr(self, name) : 定义当用户试图获取一个不存在的属性时的行为。
getattribute(self, name) :定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存
在,接着去调用 getattr )。
setattr(self, name, value) :定义当一个属性被设置时的行为。
delattr(self, name) :定义当一个属性被删除时的行为。
迭代器有两个基本的方法: iter() 和 next() 。
什么是模块:
#第一种:import 模块名
import TemperatureConversion
#第二种:from 模块名 import 函数名
from TemperatureConversion import c2f, f2c
from TemperatureConversion import *
第三种:import 模块名 as 新名字
import TemperatureConversion as tc