类与对象
类主要定义对象的结构,类不但包含方法定义,而且还包含所有实例共享的数据。
对象是类的实例
1 | class Exp: #类名大写 |
多态
1 | class Live: |
self
Python 的 self 相当于 C++ 的 this 指针。
类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身)
1 | class Ball: |
__init__
1 | class Ball: |
公有和私有
1 | 在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。 |
继承
1 | class people: |
1 | import random |
组合
1 | class Turtle: |
Taks6 函数与Lambda表达式
函数
1 | def function(arg1,arg2=V,*args,**kw,*, nkw,): |
arg1 - 位置参数 ,这些参数在调用函数 (call function) 时位置要固定。
arg2 = v - 默认参数 = 默认值,默认参数一定要放在位置参数 后面
args - 可变参数,可以是从零个到任意个,会存放所有未命名的变量参数。自动组装成元组(tuple)。
**kw - 关键字参数,可以是从零个到任意个,自动组装成字典。 (dict)
, nkw - 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 *。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#### 闭包
如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
```python
def funX(x):
def funY(y):
return x * y
return funY
i = funX(8)
print(type(i)) # <class 'function'>
print(i(5)) # 40
递归
n! = 1 x 2 x 3 x ... x n
1 | # 利用递归 |
斐波那契数列 f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1
1 | # 利用递归 |
2. Lambda 表达式
1 | lambda argument_list: expression |
匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中,主要有两种形式:
- 参数是函数 (filter, map)
- 返回值是函数 (closure)
filter(function, iterable) 过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
1 | odd = lambda x: x % 2 == 1 |
map(function, *iterables) 根据提供的函数对指定序列做映射。
1 | m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5]) |
练习
给函数参数和返回值注解?
1
def a(x: int, y: int) -> int:
分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
1
2
3a= [[6, 5], [3, 7], [2, 8]]
b=sorted(a,key=(lambda x:x[0]))
c=sorted(a,key=(lambda x:x[1]))利用python解决汉诺塔

规律:
每次都是以 a 或 b 中一根柱子为缓冲
先将除了最下面的圆盘之外的其它圆盘移动到辅助柱子上
再将最底下的圆盘移到 目标柱子上
1
2
3
4
5
6
7
8
9
10
11
12
13def hanoi(n, a, b, c):
# a 上只有一个盘子(肯定是最大的),直接搬到 c
if n == 1:
i += 1
print('移动第 {0} 次 {1} --> {2}'.format(i, a, c))
return
else:
#
hanoi(n - 1, a, c, b)
hanoi(1,a, b, c)
hanoi(n - 1, b, a, c)
hanoi(64, 'A', 'B', 'C')
Task5 字典 集合 序列
字典
{(key:value)(key:value)(key:value)}
字典以”关键字”为索引,关键字可以是任意不可变类型,通常用字符串或数值。
快速判断数据类型
X是不是可变类型:用
hash(X),只要不报错,证明X可被哈希,即不可变。
方法
dict.fromkeys(seq[, value])用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。dict.keys()返回一个可迭代对象,可以使用list()来转换为列表,列表为字典中的所有键。dict.values()返回一个迭代器,可以使用list()来转换为列表,列表为字典中的所有值。dict.items()以列表返回可遍历的 (键, 值) 元组数组。dict.get(key, default=None)返回指定键的值,如果值不在字典中返回默认值。dict.setdefault(key, default=None)和get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。key in dictin操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true。dict.pop(key[,default])删除字典给定键key所对应的值,返回值为被删除的值。key值必须给出。若key不存在,则返回default值。del dict[key]删除字典给定键key所对应的值dict.popitem()随机返回并删除字典中的一对键和值dict.clear()用于删除字典内所有元素。dict.update(dict2)把字典参数dict2的key:value对 更新到字典dict里。
练习一:
1 | dic = { |
2、字典中的value
有一个字典,保存的是学生各个编程语言的成绩,内容如下
1 | data = { |
请实现函数transfer_score(score_dict),将分数修改成int类型
1 | def transfer_score(data): |
集合 set
使用s = set()创建集合,s = {}创建空字典。
重复元素在
set中会被自动被过滤。set(value)列表或元组转换成集合集合的两个特点:无序 (unordered) 和唯一 (unique)。
set.add(elmnt):添加元素`set.update(set):添加新的元素或集合set.remove(item):移除存在的元素set.discard(value)移除元素,不存在也可以set.pop()用于随机移除一个元素。交集
1
2
3set.intersection(set1, set2)
set1 & set2
set.intersection_update(set1, set2) #在原始的集合上移除不重叠的元素并集
1
2set.union(set1, set2)
set1 | set2差集
1
2
3set.difference(set)
set1 - set2
set.difference_update(set) # 直接在原来的集合中移除元素,没有返回值异或
1
2
3set.symmetric_difference(set)
set1 ^ set2
set.symmetric_difference_update(set) # 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中包含、被包含
1
2
3set1 <= set2 / set.issubset(set)
set1 >= set2 / set.issuperset(set)set.isdisjoint(set)用于判断两个集合是否 不相交
练习二:
1 | set={1} |
序列(sub)
list(sub)、tuple(sub)、str(obj)、len(s)、max(sub)、min(sub)、sum(iterable[, start=0])、sorted(iterable, key=None, reverse=False)、reversed(seq)enumerate(sequence, [start=0])用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。1
2
3
4
5
6
7
8
9
10
11seasons = ['Spring', 'Summer', 'Fall', 'Winter']
a = list(enumerate(seasons))
print(a)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
for i, element in a:
print('{0},{1}'.format(i, element))
# 0,Spring
# 1,Summer
# 2,Fall
# 3,Winterzip(iter1 [,iter2 [...]])- 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象
利用
*号操作符,可以将元组解压为列表。1
2
3
4
5
6
7
8
9
10
11
12
13a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]
zipped = zip(a, b)
print(zipped) # <zip object at 0x000000C5D89EDD88>
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]
练习三
sort() 和 sorted() 区别
(1)sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。
iterable – 可迭代对象。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回重新排序的列表(2)sort()是列表类型的方法,只适用于列表;
(3)sorted()是内置函数,支持各种容器类型。它们都可以排序,且用法类似,但sort()是在原地排序的,不会返回排序后的列表,而sorted()是返回新的排序列表
1 | # 1 到 100 所有整数相加 |
Task4 List Tuple String
List
定义
1 | list = [ , , ] |
创建
直接创建:
list = [‘x’,’y’,’z’];list = [[1,2],[3,4]]range()创建列表:x = list(range(10));x = [[0] * 3 for row in range(4)]推导式创建列表:
1
2
3
4
5x = [0] * 5 # [0, 0, 0, 0, 0]
x = [i for i in range(5)] # [0, 1, 2, 3, 4]
x = [[0 for col in range(3)] for row in range(4)] # 4×3的二维数组
添加
list.append(obj):把一个东西整体添加在列表后list.extend(obj):把一个东西里的所有元素添加在列表后list.insert(index,obj):在编号index位置插入obj
删除
lsit.remove(obj):移除列表中的第一个匹配项list.pop([index=-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值del var1[, var2 ……]:删除单个或多个对象
获取
- 列表索引值是从0开始,索引-1返回最后一个列表元素,索引 -2 返回倒数第二个列表元素
切片写法是 start : stop : step
start1
2
3x = ['0, '1', '2', '3', '4']
print(x[3:]) # ['3', '4']
print(x[-3:]) # ['2', '3', '4']stop1
2
3week = ['0', '1', '2', '3', '4']
print(week[:3]) # ['0', '1', '2']
print(week[:-3]) # ['0', '1']
start : stop1
2
3x = ['0, '1', '2', '3', '4']
print(x[1:3]) # ['1', '2']
print(x[-3:-1]) # ['2', '3']start : stop : step1
2
3
4
5x = ['0, '1', '2', '3', '4']
print(x[1:4:2]) # ['1', '3']
print(x[:4:2]) # ['0', '2']
print(x[1::2]) # ['1', '3']
print(x[::-1]) #['4', '3', '2', '1', '0']
其它方法
list.count(obj)统计某个元素在列表中出现的次数list.index(x[, start[, end]])从列表中找出某个值第一个匹配项的索引位置list.reverse()反向列表中元素list.sort(key=None, reverse=False)对原列表进行排序。1
2
3
4
5
6
7
8x = [(2, 2), (3, 4), (4, 1), (1, 3)]
x.sort(key=takeSecond)
print(x)
# [(4, 1), (2, 2), (1, 3), (3, 4)]
x.sort(key=lambda a: a[0])
print(x)
# [(1, 3), (2, 2), (3, 4), (4, 1)]
作业
1
2
3
4
5
6
7
8
9l = [2, 5, 6, 7, 8, 9, 2, 9, 9]
l.append(15) #在列表的末尾增加元素15
l.insert(len(l)//2,20) #在列表的中间位置插入元素20
l = l + [2,5,6] #将列表[2, 5, 6]合并到lst中
l.pop(3) #移除列表中索引为3的元素
l.reverse() #翻转列表里的所有元素
l.sort() #排序,从小到大一次,从大到小一次
l.sort(reverse = True)1
2
3
4
5
6
7
8
9
10
11lst = [1, [4, 6], True]
#将列表里所有数字修改成原来的两倍
def double_list (l):
for i in range(len(l)):
if type(l[i]) is int:
l[i]=2*l[i]
elif type(l[i]) is list:
l[i]=double_list(l[i])
return l
a=double_list(lst)
print(a)leetcode 852题 山脉数组的峰顶索引
- 数组的长度大于等于3
- $\mathrm{k}[0]<\mathrm{k}[1]<\ldots<\mathrm{k}[\mathrm{i}-1]<\mathrm{k}[\mathrm{j}]>\mathrm{k}[\mathrm{i}+1] \ldots>\mathrm{k}[\operatorname{len}(\mathrm{k})-1]$
1
2
3
4
5class Solution:
def peakIndexInMountainArray(self, A: List[int]) -> int:
for i in range(1,len(A)):
if A[i-1]<A[i]>A[i+1]:
return i
Tuple
定义:(元素1, 元素2, ..., 元素n),被创建后就不能对其进行修改
更新和删除一个元组
1 | week = ('Monday', 'Tuesday', 'Thursday', 'Friday') |
内置方法
只有 count 和 index 两种方法。
count记录在元组 t 中该元素出现几次,index 找到在元组 t 的索引
解压元组
1 | t = (1, 10.31, 'python') |
==String==
常用内置方法
capitalize()将字符串的第一个字符转换为大写。lower()转换字符串中所有大写字符为小写。upper()转换字符串中的小写字母为大写。swapcase()将字符串中大写转换为小写,小写转换为大写。count(str, beg= 0,end=len(string))endswith(suffix, beg=0, end=len(string))检查字符串是否以指定子字符串结束,True、FALSEstartswith(substr, beg=0,end=len(string))检查字符串是否以指定子字符串开始,True、FALSEfind(str, beg=0, end=len(string))检测str是否包含在字符串中,包含,返回开始的索引值,否则返回 -1。isnumeric()如果字符串中只包含数字字符,则返回 True,否则返回 False。ljust(width[, fillchar])返回一个原字符串左对齐,并使用fillchar(默认空格)填充至长度width的新字符串。rjust(width[, fillchar])返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度width的新字符串。1
2
3str4 = '1101'
print(str4.ljust(8, '0')) # 11010000
print(str4.rjust(8, '0')) # 00001101lstrip([chars])截掉字符串左边的空格或指定字符。rstrip([chars])删除字符串末尾的空格或指定字符。==
strip([chars])在字符串上执行lstrip()和rstrip()。==partition(sub)找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub),如果字符串中不包含sub则返回('原字符串','','')。1
2
3
4str5 = ' I Love LsgoGroup '
print(str5.strip().partition('o')) # ('I L', 'o', 've LsgoGroup')
print(str5.strip().partition('m')) # ('I Love LsgoGroup', '', '')
print(str5.strip().rpartition('o')) # ('I Love LsgoGr', 'o', 'up')==
replace(old, new [, max])把 将字符串中的old替换成new,如果max指定,则替换不超过max次。====
split(str="", num)不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。==1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44str5 = ' I Love LsgoGroup '
print(str5.strip().split()) # ['I', 'Love', 'LsgoGroup']
print(str5.strip().split('o')) # ['I L', 've Lsg', 'Gr', 'up']
u = "www.baidu.com.cn"
# 使用默认分隔符
print(u.split()) # ['www.baidu.com.cn']
# 以"."为分隔符
print((u.split('.'))) # ['www', 'baidu', 'com', 'cn']
# 分割0次
print((u.split(".", 0))) # ['www.baidu.com.cn']
# 分割一次
print((u.split(".", 1))) # ['www', 'baidu.com.cn']
# 分割两次
print(u.split(".", 2)) # ['www', 'baidu', 'com.cn']
# 分割两次,并取序列为1的项
print((u.split(".", 2)[1])) # baidu
# 分割两次,并把分割后的三个部分保存到三个变量
u1, u2, u3 = u.split(".", 2)
print(u1) # www
print(u2) # baidu
print(u3) # com.cn
c = '''say
hello
baby'''
print(c)
# say
# hello
# baby
print(c.split('\n')) # ['say', 'hello', 'baby']
string = "hello boy<[www.baidu.com]>byebye"
print(string.split('[')[1].split(']')[0]) # www.baidu.com
print(string.split('[')[1].split(']')[0].split('.')) # ['www', 'baidu', 'com']splitlines([keepends])按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数keepends为 False,不包含换行符,如果为 True,则保留换行符。1
2
3str6 = 'I \n Love \n LsgoGroup'
print(str6.splitlines()) # ['I ', ' Love ', ' LsgoGroup']
print(str6.splitlines(True)) # ['I \n', ' Love \n', ' LsgoGroup']maketrans(intab, outtab)创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。translate(table, deletechars="")根据参数table给出的表,转换字符串的字符,要过滤掉的字符放到deletechars参数中。1
2
3
4
5
6str7 = 'this is string example....wow!!!'
intab = 'aeiou'
outtab = '12345'
trantab = str7.maketrans(intab, outtab)
print(trantab) # {97: 49, 111: 52, 117: 53, 101: 50, 105: 51}
print(str7.translate(trantab)) # th3s 3s str3ng 2x1mpl2....w4w!!!
字符串格式化
1 | str8 = "{0} Love {1}".format('I', 'Lsgogroup') # 位置参数 |
| 符 号 | 描述 |
|---|---|
| %c | 格式化字符及其ASCII码 |
| %s | 格式化字符串,用str()方法处理对象 |
| %r | 格式化字符串,用rper()方法处理对象 |
| %d | 格式化整数 |
| %o | 格式化无符号八进制数 |
| %x | 格式化无符号十六进制数 |
| %X | 格式化无符号十六进制数(大写) |
| %f | 格式化浮点数字,可指定小数点后的精度 |
| %e | 用科学计数法格式化浮点数 |
| %E | 作用同%e,用科学计数法格式化浮点数 |
| %g | 根据值的大小决定使用%f或%e |
| %G | 作用同%g,根据值的大小决定使用%f或%E |
1 | print('%c' % 97) # a |
| 符号 | 功能 |
|---|---|
m.n |
m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
- |
用作左对齐 |
+ |
在正数前面显示加号( + ) |
# |
在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 |
显示的数字前面填充’0’而不是默认的空格 |
作业
字符串函数回顾
实现isdigit函数:字符串里是否只包含数字0~9
1
2
3
4
5
6
7
8
9
10
11
12def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
# your code here
flag = True if string.isnumeric() else False
return flag
a = input("请输入:")
flag = isdigit(a)
print(flag)leetcode 5题 最长回文子串
给定一个字符串
s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”1
2
3
4
5
6
7
8
9
10
11
12class Solution:
def longestPalindrome(self, s: str) -> str:
l = len(s)
maxlen = 0
maxstr = ''
for i in range(l):
for j in range(i+1,l+1):
temp =s[i:j]
if temp == temp[::-1] and j-i > maxlength:
maxstr = s[i:j]
maxlength = j-i
return maxstr
Task3_作业
1 | import random |

Python标准警告总结
- Warning:警告的基类
- DeprecationWarning:关于被弃用的特征的警告
- FutureWarning:关于构造将来语义会有改变的警告
- UserWarning:用户代码生成的警告
- PendingDeprecationWarning:关于特性将会被废弃的警告
- RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
- SyntaxWarning:可疑语法的警告
- ImportWarning:用于在导入模块过程中触发的警告
- UnicodeWarning:与Unicode相关的警告
- BytesWarning:与字节或字节码相关的警告
- ResourceWarning:与资源使用相关的警告
random
1 | #!/usr/bin/python |
Task2_作业
- 编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。
1 | x = [i for i in range(1500,2700) if (i%5) == 0 and (i%7) == 0] |
- 龟兔赛跑游戏
题目描述:任一秒结束后兔子发现自己领先**x米或以上,会停下s秒**。对于不同的兔子,x,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
兔子的速度v1(表示每秒兔子能跑v1 米),乌龟的速度v2,以及兔子对应的x,s值,以及赛道的长度l——就能预测出比赛的结果。写一个程序,对于输入的一场比赛的数据v1,v2,x,s,l,预测该场比赛的结果。
输入: 输入只有一行,包含用空格隔开的五个正整数v1,v2,x,s,l,其中(v1,v2< =100;x< =300;s< =10;l< =10000且为v1,v2的公倍数)
输出: 输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入:
10 5 5 2 20
样例输出
D
4
1 | def end(l_1,l_2,l): |
Task1_作业
- 怎样对python中的代码进行注释?
#注释单行''' '''或者""" """表示区间注释,中间内容被注释- 快捷键
cmd+?,可以通过#快速注释多行
- python有哪些运算符,这些运算符的优先级是怎样的?
算术运算符:+、-、*、/、%、**、//
比较运算符:==、!=、>、<、>=、<=
赋值运算符:=、 +=、 -=、 =、 /=、 %=、 *=、 //=、 ==:=(海象运算符,3.8新增)==
位运算符:&、 | 、^ 、~
逻辑运算符:and 、or、not
成员运算符:in、not in
身份运算符:is 、not is
优先级:
| 运算符 | 描述 |
| ———————————— | ——————————————————————————— |
| | 指数 (最高优先级) |
| ~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
| / % // | 乘,除,求余数和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 ‘AND’ |
| ^ | | 位运算符 |
| <= < > >= | 比较运算符 |
| == != | 等于运算符 |
| = %= /= //= -= += = = | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not and or | 逻辑运算符 |
- python 中
is,is not与==,!=的区别是什么?
1 | 身份运算符用于比较两个对象的存储单元, |
- python 中包含哪些数据类型?这些数据类型之间如何转换?
Number(数字)——不可变数据
String(字符串)——不可变数据
Tuple(元组)——不可变数据
List(列表)——可变数据
Set(集合)——可变数据
Dictionary(字典)——可变数据
| 函数 | 描述 |
|---|---|
| int(x [,base]) | 将x转换为一个整数 |
| float(x) | 将x转换到一个浮点数 |
| complex(real [,imag]) | 创建一个复数 |
| str(x) | 将对象 x 转换为字符串 |
| repr(x) | 将对象 x 转换为表达式字符串 |
| eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
| tuple(s) | 将序列 s 转换为一个元组 |
| list(s) | 将序列 s 转换为一个列表 |
| set(s) | 转换为可变集合 |
| dict(d) | 创建一个字典。d 必须是一个 (key, value)元组序列。 |
| frozenset(s) | 转换为不可变集合 |
| chr(x) | 将一个整数转换为一个字符 |
| ord(x) | 将一个字符转换为它的整数值 |
| hex(x) | 将一个整数转换为一个十六进制字符串 |
| oct(x) | 将一个整数转换为一个八进制字符串 |