Python 笔记(简单记录)
1、
用input进行输入,不管输入的是什么最后输出的类型都是字符串
如果再用spam/10会得到报错信息
2、对浮点数取整用int()
3、else语句不包含条件
4、一旦有一个elif为true其他elif语句会自动跳过
5、while循环块在执行完最后一条语句之后会返回到while的判断中,知道while的结果为false就不再继续执行while了
6、if not name这句话本来就表示如果输入的name为空字符串
7、range(12,16)
他的范围是12,13,14,15不包含最后一个数字
Range(0,10,2)最后一个数字代表步长
又由于不包含最后一个数字10,所以他是从0开始数到8
即0,2,4,6,8
可以用负数作为步长只是这种是不断减少
Range (101)就是从0到100这101个数
8、from random import *这个语句和import random都是导入random模块,但是使用前者的形式在调用random模块中的函数的时候不需要random.的前缀。但是使用完整的前缀的名称会让代码更好读,所以最好用普通形式的import语句。
9、sys.exit()能提前结束程序。要提前导入sys模块
10、局部作用域不能使用其他局部作用域内的变量
11、如果需要在一个函数内修改全局变量需要global语句,例如
12、
一旦执行了except就不会继续执行完try里面后面的语句,例如一旦判断除数是零了就不会再去执行print(spam(1))
Collatz序列不断调用同一个函数
#笔误:反——>返
13在python中使用列表
- 1)
- [... for ... if ...]:这是一个列表推导式的语法结构,它会根据循环和条件判断的结果创建一个新的列表。
因此,整个表达式的结果是:遍历str_input字符串,对于每个字符,如果它是字母,就将其转换为小写,然后将这些小写字母组成一个新的列表cleaned_chars。非字母字符将被忽略
2)
join()方法,其作用是将一个可迭代的对象(在这里是列表cleaned_chars)中的所有元素连接起来,形成一个字符串。
cleaned_chars = ['h', 'e', 'l', 'l', 'o'] # 假设这是之前通过某种方式得到的列表
cleaned_str = ''.join(cleaned_chars) # 使用join()方法连接列表中的元素
print(cleaned_str) # 输出 'hello'
3)
- [::-1]:这是一个切片语法,:操作符表示切片操作,-1表示步长为-1,这意味着从字符串的最后一个字符开始,向第一个字符方向进行切片。
cleaned_str[::-1]
会创建一个新字符串,它是cleaned_str
的倒序字符串
14常用切片操作
以下所有的stop和start指的都是下标
- 基本切片:seq[start:stop]
- 从索引start开始到索引stop结束,但不包括stop。
- 如果start或stop被省略,则默认从序列的开始或结束。
my_list = [0, 1, 2, 3, 4, 5]
print(my_list[1:4]) # 输出 [1, 2, 3]
- 负索引切片:seq[start:stop]
- 使用负索引从序列的末尾开始计数。
print(my_list[-3:-1]) # 输出 [3, 4]
- 步长切片:seq[start:stop:step]
- step参数指定切片的步长。
print(my_list[0:6:2]) # 输出 [0, 2, 4]
- 反转序列:seq[::-1]
- 使用-1作为步长来反转序列。
print(my_list[::-1]) # 输出 [5, 4, 3, 2, 1, 0]
- 复制序列:seq[:]
- 不带任何参数的切片操作可以用来复制整个序列。
my_list_copy = my_list[:]
print(my_list_copy) # 输出 [0, 1, 2, 3, 4, 5]
- 提取序列的一部分:seq[start:] 或 seq[:stop]
- 只提供start或stop中的一个,另一个默认到序列的开始或结束。
print(my_list[2:]) # 输出 [2, 3, 4, 5]
print(my_list[:3]) # 输出 [0, 1, 2]
- 带步长的切片:seq[::step]
- 只提供step参数,start和stop默认到序列的开始和结束。
print(my_list[::2]) # 输出 [0, 2, 4]
这些切片操作不仅适用于列表,也适用于字符串、元组
15输出列表的元素和对应的下标
你可以使用内置的enumerate()函数来同时输出列表的元素及其对应的下标
16动态规划法写斐波那契数列
16以阶梯形状输出九九乘法表
在Python中,f""
或者 f' '
是一种字符串格式化的语法,称为格式化字符串字面量(formatted string literals),也常简称为f-strings。这种字符串字面量是在Python 3.6及以后的版本中引入的。
f-strings 允许你在字符串字面量中嵌入表达式,并在运行时动态地计算和替换这些表达式。嵌入的表达式需要放在花括号 {}
内。
只有写end=“\t”才能输出阶梯型不然是按行输出,如下:
Print里面可以用f函数也可以不用
17找素数的方法
1)最快方法
2)很慢
3)输出所有素数
18明天基本数据类型
类重写多态
Python常规操作,大写字母小写字母,输出带不带空格
18,列表的下标为-1就是从最后一个元素开始;列表的下标为-2就是从倒数第二个元素开始
用len获取列表的长度,即列表中元素的个数
A[1,2,3]
Len(a)
19、+ 连接两个列表 *号用于复制
20、del函数用来删除列表中的某个元素,用列表的下标实现
21
使用str(len(a)+1)来显示对应的列表的的个数
这里用来显示你输入的是第几只猫的名字
22、range(len(a))这句话将迭代a的所有下标,无论他包含几项
23、多重赋值
24、方法和函数是一回事,只不过调用方法的时候要加个点
例如spam.Index(‘hello’)
而函数是直接可以用
每种数据类型都有它自己的一组方法
25、sort是当场对列表进行排序,不能记录器返回值
Spam=spam.sort()是错的
26、注意len返回的是列表中的元素个数,random.randint(0,9)实际的范围是真的到9,不减一的话会报超出列表范围的错
27、字符串是类似于列表的
列表中的len,in ,not in也可以用于字符串
28、字符串是不可被更改的,列表可以被更改,这是区别
想改变字符串只能创造出一个新的
29、元祖与列表的区别是,元祖用圆括号列表用方括号,另外元祖不可变
30、强制转换
31、引用
将一个列表赋值给一个变量时,实际是将列表的“引用”赋值给了该变量,引用是一个值指向某些数据,列表引用是指向一个列表的值。具体见书P75和P76
A和b都是对这个列表的引用,所以改变b之后a也跟着改变。A幅值给b之后只是把引用赋值给了b没有把列表赋值过去
32、传递引用
返回None是因为他本身没有返回值
这样就可以了
这说明尽管spam和addd是两个变量但是都指向的是同一个列表。函数传递的是引用
33、不只是复制引用:
使用copy和deepcopy
字典列表通用
Spam和cheese指向的是不同列表
Copy.copy()创建了一个新的列表
如果原来的spam中含有好几个列表,就用copy.decopy()
34、【】是一个空列表,类似于‘’
35、join情景再现。Join是str的方法,可用于连接列表
36python有判断继承关系的函数
Isinstance用于检查实例
Issubclass用于检查类继承关系
(上图来源于Python学习(七)面向对象 ——继承和多态 - feesland - 博客园 (cnblogs.com))
37 python中用
一个杠_ 表示受保护属性:外部不可以访问,只能在类的内部和子类访问
两个杠表示私有属性__:不应该在类的外部被访问,可以在类的方法中被访问,子类不可以访问
和封装属性类似,在类内部需要封装的方法前面加上双下划线
“__”
。在外部调用的时候就会报错
如果我非要在外部调用双划线的方法:单画线加类名
(上图来源于Python入门基础教程:继承、封装、多态 (非常详细)_python封装继承多态-CSDN博客)
由此可见:
Python 的封装并不是真正意义上的外部无法调用,与java ,PHP等语言不同,Python若调用封装的属性或方法,需要在方法和属性前加_类名。
38属性装饰器&方法装饰器
@property装饰器用于定义属性的访问器,它会将属性定义为一个只读属性。当外部代码试图修改这个属性时,会触发一个AttributeError异常。
@属性名.setter装饰器用于定义属性的修改器,它可以让外部代码修改这个属性的值。当外部代码试图读取这个属性时,会触发一个AttributeError异常。
(上图来源于 Python入门基础教程:继承、封装、多态 (非常详细)_python封装继承多态-CSDN博客)
39
python的封装是为了隐藏细节
封装的目的是隐藏类的实现细节,只暴露必要的接口给外部使用。如果一个属性或方法被公开为可访问的,那么它将变得容易受到攻击和滥用。例如,如果一个类的__init__()方法可以接受任意数量的参数,那么任何人都可以构造恶意对象并调用该方法。
通过将属性或方法定义为私有,我们可以确保只有类内部的对象才能访问它们。这有助于保护类的实现细节,防止不必要的干扰和错误。此外,封装还有助于提高代码的可维护性和可重用性,因为它可以将类的实现细节隐藏起来,使代码更加清晰和易于理解。
子类的封装属性以及方法不会覆盖父类的封装属性或方法
40
以下这段代码是错的
- 子类初始化的时候不能直接初始化,要用父类初始化。
Def __init__(self,name)
Super().__init__(self,name,age)
2、Baba输出woof的时候,要用print因为,原函数只是返回没有打印
改正如下:
40重写
子类对继承的父类的某个方法或属性不满意,可以在子类对其(方法体)0进行重新编写,重写后的方法可以通过super().xxx()调用父类中被重写的方法
这句话输出了bb和woof,并没有因为重写之后函数多了一个打印使得无法再次通过print打印出woof
41如果dog类继承animal这个类,在创建一个class dage(animal,dog)这个类,会报错。不能这样用
42对kity来说他animal和people都有speak,但是他离animal近就用animal的方法。
这样改就不会报错了,分别继承两个无关的类
43在python中object是所有类的父类
Object有一个__str__()方法用于返回一个对于对象的描述
44
截图这种不叫多态:多态一定是发生在子类与父类之间的。子类重写了父类的方法
45这种是多态
还可以这样实现多态(一定确保有父子关系):
46字典
与列表一样字典是多种元素的集合,但不像列表有下标,字典的索引被称为:键
键及其关联的值成为“键----值”
Mycat={‘size’=’big’,’color’=’orange’}
Print(Mycat{‘size’})
字典可以用整数值作为‘键’
字典中的表项不是排序 放置的
与键值的顺序无关,只要内容一样就一样
47字典中的三个方法
Keys(),values(),items()三个可以用于for循环
For k in eggs.keys():
Print(k)
其他类似
查看字典中是否存在键或值,可以用in如 if 1hao in eggs.keys():
48当不知道字典当中有什么键值的时候可以用get()
如:
49直接打印eggs发现原来的1hao不会变成kity,setdefault会在没有那个键的时候再原来的字典中添加键和值,但是如果原来的字典中有输入的键就不会重新添加,而且输入的值夜不会取代原来的值
实际应用:
50 pprint()
完成漂亮的打印
貌似没啥用,可能用错了
51
字典的嵌套,注意用的是v.get(‘键’,‘值’),因为v在这里他自己就是一个字典
52 字符串的操作
如果一句话当中有单引号,那这句话就要用双引号引用。
以下是转义字符:
\n 换行符
\t 制表符
\\ 表示反斜杠
\’表示单引号
\”表示双引号
53
原始字符串前加r,也就是单引号里有啥就输出啥
54 三重引号
1、就是可以换行输出
2、多行注释
55、常用字符串方法
解释:第二句话前面有空格,因为\n和spam2 之间有逗号
以下两种为修改后的情况
常用方法 isupper()和islower()其他isXXXX的都是用来判断的
startswitch()和endswitch()用来判断是否以啥开头以啥结束
Join()和split()
Join()用于连接字符串和字符串列表成为一个孤单的字符串
Split()用于删掉不想要的,但是最后胡出现的还是【】
Rjust(),ljust(),center()方法对齐文本,通过加空格来对齐
左对齐
右对齐
不通过空格版:
Center()
Strip(),lstrip(),rstrip()删除空白字符
删两边 删左边 删右边
56 、windows系统中路径用反斜杠而不是斜杠
57、打开文件用open
Fielpath=‘文件路径’
With open(filepath)as file1:
Neirong=file1.read()获取全部内容
Filename=‘文件名字’
With open(filename)as file2:
Hang=file2.readlines()#按行读取
Hang1=file2.rstrip()
Hang2=file2.lstrip()
Hang3=file2.strip()
58
OrderedDict这个方法是collections中的,需要导入,它与其他字典的区别是,他能记住导入顺序。如下直接输出发现它是列表嵌套字典
59字典的打印
60将实例用作属性
将类的一部分作为独立的一部分提取出来
定义一个新的类但是不继承任何类,
两个类里面的属性互不影响,Xin只是对Die类的补充,注意调用的时候
61类中的方法可以对属性中的值进行递增
62
给形参指定默认值的时候等号两边不要有空格!
对函数中的关键字实参也遵循之中约定!
不加也不会报错,但这就是约定
63
使用as给模块指定别名
64
from模块import特定函数
65将函数存储在模块就是新建立一个.py文件然后写几个函数
例如有个pizza.py文件
Import pizza
然后在main中调用其中的函数即可
pizza.make_pizza()
66、定义一个函数以元祖和字典为形参
单星元祖,双星字典
下面这种情况是因为元祖啥都能装,就把a和b都当成装在里面的内容了,
而字典中没接收到内容:
下面这样传参会报错
直接传字典也报错
这样也报错
这样也不对
这样也报错:
哈哈直接传就对了
函数4这样做就对了,写双星就默认传进去的是字典
Func2也对了
Python会先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。如果要让函数接受不同类型的实参,需要在函数定义中将接纳任意数量的形参放在最后
67禁止函数改变列表,可以向函数传一个复制品
如上,记住列表是【】不是{ }
68
删除列表中的特定值用remove
一次只能删一个
但是可以用循环就都删了
While ai in c:
c.remove(‘ai‘)’
69 pop删除列表最后一个元素,一次删一个
用循环可以多次删除
还可以这样用,注意向一个列表当中添加项要用append!
70
用键名取找字典中的每一项
嵌套:列表嵌套字典
71按顺序遍历字典中的所有键
72删除键值对
删除键值对,要用del语句删除对应的键
73、修改字典中的键值对,用键名
字典是一种动态结构可以随时添加键值对
74、
确定列表是否为空
直接if加列表名就行
75修改元祖变量
给元祖变量赋值是合法的
元祖是比列表简单的数据结构,如果需要存储一组值在程序的整个生命周期内都不变,可使用元祖
但是如果像列表那样一个元素一个元素的改就报错了
76
注意 列表.reverse()是将列表反向打印,不是按照字母顺序反向打印
77
Sorted()对列表进行临时排序
Sort()是永久性对列表进行排序
78 pop可以删除列表最后一个元素并且你还可以使用它
如果想弹出特定位置的元素
比如:列表.pop(0) 列表.pop(99)
79
Remove是删除特定元素
80
相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。
集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。所以,下面这样的操作是错误的,Python 会抛出异常。
要判断一个元素在不在字典或集合内,我们可以用 value in dict/set 来判断(对于字典,只能使用key in dict 来判断)。
而对于集合,其排序和前面讲过的列表、元组很类似,直接调用 sorted(set) 即可,结果会返回一个排好序的列表。
假设列表有 n 个元素,而查找的过程要遍历列表,那么时间复杂度就为O ( n ) O(n)O(n)。即使我们先对列表进行排序,然后使用二分查找,也会需要O ( log n ) O(\log n)O(logn)的时间复杂度,更何况,列表的排序还需要O ( n log n ) O(n\log n)O(nlogn)的时间。
如果我们用字典来存储这些数据,那么查找就会非常便捷高效,只需O ( 1 ) O(1)O(1)的时间复杂度就可以完成。
字典的内部组成是一张哈希表,你可以直接通过键的哈希值,找到其对应的值。
81
#判断是否为回文
is_palindrome = cleaned_str == cleaned_str[::-1]
82字符串的公共片段
def fun_1(list_input):
"""
接收一个列表(仅由数字构成),返回该列表的最小元素以及对应元素的索引
:param list_input: 输入的列表
:return: 最小元素,对应元素的索引
"""
min_value = min(list_input)
min_index = []
for index, value in enumerate(list_input):
if value == min_value: # 如果当前值等于最小值
min_index.append(index) # 将当前索引添加到索引列表中
return min_value, min_index
def fun_2(list_input):
"""
接收一个数字列表,返回该列表的所有非零元素的乘积,特殊情况:如果列表中没有非零元素,返回1
:param list_input: 输入的列表
:return: 返回非零元素的乘积
"""
product = 1
non_zero_found = False #是否找到了非零元素
for number in list_input:
if number != 0: # 如果当前元素非零
product *= number
non_zero_found = True # 标记找到了非零元素
if not non_zero_found: # 如果没有找到非零元素
return 1
else:
return product # 返回乘积
def fun_3(str_input):
"""
输入一个字符串数组,返回这些字符串从头开始的公共部分,如果没有,则返回空字符串""
:param str_input: 输入的字符串数组
:return: 返回的字符串
"""
if not str_input:
return ""
prefix = str_input[0]
for string in str_input[1:]:
while not string.startswith(prefix):
prefix = prefix[:-1]
if not prefix:
return ""
return prefix
def fun_4(str_input):
"""
将输入的字符串删除所有非字母字符并全转为小写,转换后的字符串如果前往后读和后往前读一致则返回true,否则返回false
:param str_input: 输入的字符串
:return: 前后阅读一致则返回true,否则为false
"""
#小写
cleaned_chars = [char.lower() for char in str_input if char.isalpha()]
#重组
cleaned_str = ''.join(cleaned_chars)
#判断是否为回文
is_palindrome = cleaned_str == cleaned_str[::-1]
return is_palindrome
list=[1,2,3,4]
print(fun_1(list))
print(fun_2(list))
#array=["abc","abb","abcd","b"]
#array=["abc","abb","abcd"]
array=["Abc","cba"]
print(fun_3(array))
print(fun_4(array))