python的些许笔记(Point)
于C语言中文网:C语言程序设计门户网站(入门教程、编程软件) (biancheng.net)
于csdn的python技能树:(56条消息) 技能树
千万注意缩进规则,以前觉得没啥问题,自己肯定可以,但是真正使用起来跟没学差不多。
10/21/2021
pthon的缓存重用机制
如图所示,我进行了相关实验,发现小于-5的也会分配到重用内存
(大量使用 id() 内置函数,该函数的功能是获取变量(对象)所在的内存地址)
是不是很神奇,哈哈,或许是升级了,也可能是你c语言网out了 🐕
(其实是因为自己比较懒,不想上网查原因,网上应该课可搜寻到,等我学完python再回头看看)
input():str = input(tipmsg)
注意类型转换,输入进去的无论什么都会变成str类型,那么如果我们需要对输入的进行
print()
类似C#,但是有些许不同,但是语言逻辑是十分相近,所以学习的时候不要担心学不会
一些典型运用:
1 | age = 8 |
1 | name = "C语言中文网" |
还有一些输出形式的指定,比如正数带+,负数带-,左对齐方式输出,指定精度
转义字符及用法\
\0 开头表示后跟八进制形式的编码值
\x 开头表示后跟十六进制形式的编码值
ps:后面最多只能跟两位数字,所以八进制形式\0
并不能表示所有的 ASCII 字符,只有十六进制形式\x
才能表示所有 ASCII 字符
位运算与逻辑运算等运算
位运算
只对整数,与数据在内存中的存储格式有关。
逻辑
在 Python 中,and 和 or 不一定会计算右边表达式的值,有时候只计算左边表达式的值就能得到最终结果。and只要有一个假的,那右边就不用再进行计算了。
另外,and 和 or 运算符会将其中一个表达式的值作为最终结果,而不是将 True 或者 False 作为最终结果。
三目运算
1 | exp1 if contion else exp2 |
condition 是判断条件。exp1 和 exp2 是两个表达式。
如果 condition 成立(结果为真),就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立(结果为假),就执行 exp2,并把 exp2 的结果作为整个表达式的结果。
运算符优先级
Python运算符优先级和结合性一览表 (biancheng.net)
列表,元组,字典和集合
索引
1 | 0 1 2 3 4 5...n 索引从左往右 |
需要注意的点是
1 | (abdce) |
序列切片
1 | 访问一定范围的序列 |
检查元素是否包含在序列中
1 | 使用 in 关键字检查某元素是否为序列的成员 |
与序列相关的内置函数
1 | str="c.biancheng.net" |
列表
element1 ~ elementn 表示列表中的元素,个数没有限制,只要是 Python 支持的数据类型就可以
1 | [element1, element2, element3, ..., elementn] |
创建列表(栗子)
1 | num = [1, 2, 3, 4, 5, 6, 7] |
1 | nulllist=[] //列表可以为空 |
1 | list()函数创建列表 |
有创就有删,21世纪套餐,增删改查
删除列表
1 | del listname |
1 | testlist=[1,2,3,4] |
添加元素
1 | a=[1] |
1 | Python append()方法添加元素: |
1 | Python extend()方法添加元素; |
1 | Python insert()方法插入元素: |
还是那句话有增就有删
删除元素
1 | del命令:不仅可以删除整个列表,还可以删除列表中的某些元素。 |
1 | #删除单个元素:del listname[index] |
修改元素
1 | #修改单个元素:listname[index]=修改值 |
查找元素
列表(list)提供了 index() 和 count() 方法,它们都可以用来查找元素。
index()
1 | index() 方法用来查找某个元素在列表中出现的位置(也就是索引); |
count()
1 | count() 方法用来统计某个元素在列表中出现的次数: listname.count(obj) |
注意事项
1 | 添加元素 |
1 | 删除元素 |
列表函数range
列表非常适合用于存储数字集合
1 | Python 提供了 range() 函数,可帮助我们高效地处理数字列表,即便列表需要包含数百万个元素,也可以快速实现。 |
list实现队列与栈方法
list实现队列(insert插入)
1 | queue=[] |
list实现栈(append插入)
1 | stack=[] |
collections模块实现栈和队列
上述实现队列与栈的效率过低,调用标准库, collection模块中的deque结构体
注意调用语法
1 | from collecions import deque |
元组(tuple)
元组(tuple)是 [Python] 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。
元组和列表(list)的不同之处在于:
- 列表的元素是可以更改的,包括修改元素值,删除和插入元素,所以列表是可变序列;
- 而元组一旦被创建,它的元素就不可更改了,所以元组是不可变序列。
- 元组要比列表更加轻量级,所以从总体上来说,元组的性能速度要优于列表。
- Python元组和列表的区别 (biancheng.net)太多了,不好记,放在这里不记得再看
创建元组
在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组,请看下面的例子,
需要注意的一点是,当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串
1 | 使用 ( ) 直接创建 |
Python访问元组元素
1 | tuplename[index] |
Python修改元组
1 | 因为元组为不可变序列,估所以我们只能创建一个新的元组去替代旧的元组。 |
Python删除元组
1 | 与上同,只能通郭del全部删除 |
Python dict字典
Python字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。
字典类型是 Python 中唯一的映射类型,映射
指的是元素之间相互对应的关系。
习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。
主要特征 | 解释 |
---|---|
通过键而不是通过索引来读取元素 | 字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。 |
字典是任意数据类型的无序集合 | 和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。 |
字典是可变的,并且可以任意嵌套 | 字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典。 |
字典中的键必须唯一 | 字典中,不支持同一个键出现多次,否则只会保留最后一个键值对。 |
字典中的键必须不可变 | 字典中每个键值对的键是不可变的,只能使用数字、字符串或者元组,不能使用列表。 |
Python创建字典
1 | #使用 { } 创建字典 |
通过 dict() 映射函数创建字典
创建格式 | 注意事项 |
---|---|
a = dict(str1=value1, str2=value2, str3=value3) | str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号。 |
#方式1 demo = [(‘two’,2), (‘one’,1), (‘three’,3)] #方式2 demo = [[‘two’,2], [‘one’,1], [‘three’,3]] #方式3 demo = ((‘two’,2), (‘one’,1), (‘three’,3)) #方式4 demo = ([‘two’,2], [‘one’,1], [‘three’,3]) a = dict(demo) | 向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。 |
keys = [‘one’, ‘two’, ‘three’] #还可以是字符串或元组 values = [1, 2, 3] #还可以是字符串或元组 a = dict( zip(keys, values) ) | 通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。 |
Python 访问字典
1 | 列表和元组是通过下标来访问元素的,而字典不同,它通过键来访问对应的值。因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。 |
1 | #dictname[key] //键必须是存在的,否则会抛出异常。 |
Python删除字典
1 | 使用 del 关键字 |
Python dict字典基本操作(增,删,改:键值对)
由于字典属于可变序列,所以我们可以任意操作字典中的键值对(key-value)。Python 中,常见的字典操作有以下几种:
- 向现有字典中添加新的键值对。
- 修改现有字典中的键值对。
- 从现有字典中删除指定的键值对。
- 判断现有字典中是否存在指定的键值对。
对键的操作
1 | #Python字典添加键值对 |
Python使用字典格式化字符串
如果格式化字符串的模板中包含了多个转换说明符,后面就得按照顺序给出多个对应的变量;当字符串模板中只包含少量转换说明符时,这种写法还是比较合适的,但如果字符串模板中包含大量转换说明符,这种按顺序提供变量的方式就有些麻烦了
1 | 实例 |
字典函数补充
keys()、values() 和 items() 方法
将这三个方法放在一起介绍,是因为它们都用来获取字典中的特定数据:
- keys() 方法用于返回字典中的所有键(key);
- values() 方法用于返回字典中所有键对应的值(value);
- items() 用于返回字典中所有的键值对(key-value)。
1 | 在Python3.x版本返回的类型都不是list类型,因为Python 3.x 不希望用户直接操作这几个方法的返回值。但是2.x版本是返回list类型 |
copy()
1 | copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典 |
浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。但是容易出问题。
1 | #常见的浅拷贝的方法,是使用数据类型本身的构造器 |
所谓深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。(完全独立,无论怎么变,新拷贝的都不会改变)
1 | #Python 中以 copy.deepcopy() 来实现对象的深度拷贝。 |
update()
1 | 使用一个字典所包含的键值对来更新己有的字典; |
pop() 和 popitem() 方法
1 | 二者都是用来删除字典中的键值对; |
setdefault() 方法
1 | setdefault() 方法用来返回某个 key 对应的 value,其语法格式如下: |
setdefault() 方法总能返回指定 key 对应的 value:
如果该 key 存在,那么直接返回该 key 对应的 value;
如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue
Python set集合详解
Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。
从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔,如下所示:(elementn 表示集合中的元素,个数没有限制。)
1 | {element1,element2,...,elementn} |
注意!同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。
创建set集合
1 | #使用 {} 创建 |
访问set元素
1 | #最常用循环结构,逐一读取 |
删除set集合
1 | #同样的使用del()元素 |
对set集合操作(基本)
添加元素
1 | #使用add()函数实现 |
注意:add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加
列表、
字典、
集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。
删除元素
1 | #remove(),如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误 |
Python set集合做交集、并集、差集运算
运算操作 | Python运算符 | 含义 | 例子 | ||
---|---|---|---|---|---|
交集 | & | 取两集合公共的元素 | >>> set1 & set2 {3} | ||
并集 | \ | 取两集合全部的元素 | >>> set1 \ | set2 {1,2,3,4,5} | |
差集 | - | 取一个集合中另一集合没有的元素 | >>> set1 - set2 {1,2} >>> set2 - set1 {4,5} | ||
对称差集 | ^ | 取集合 A 和 B 中不属于 A&B 的元素 | >>> set1 ^ set2 {1,2,4,5} |
set集合函数总结
方法名 | 语法格式 | 功能 | 实例 |
---|---|---|---|
add() | set1.add() | 向 set1 集合中添加数字、字符串、元组或者布尔类型 | >>> set1 = {1,2,3} >>> set1.add((1,2)) >>> set1 {(1, 2), 1, 2, 3} |
clear() | set1.clear() | 清空 set1 集合中所有元素 | >>> set1 = {1,2,3} >>> set1.clear() >>> set1 set() set()才表示空集合,{}表示的是空字典 |
copy() | set2 = set1.copy() | 拷贝 set1 集合给 set2 | >>> set1 = {1,2,3} >>> set2 = set1.copy() >>> set1.add(4) >>> set1 {1, 2, 3, 4} >>> set1 {1, 2, 3} |
difference() | set3 = set1.difference(set2) | 将 set1 中有而 set2 没有的元素给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.difference(set2) >>> set3 {1, 2} |
difference_update() | set1.difference_update(set2) | 从 set1 中删除与 set2 相同的元素 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.difference_update(set2) >>> set1 {1, 2} |
discard() | set1.discard(elem) | 删除 set1 中的 elem 元素 | >>> set1 = {1,2,3} >>> set1.discard(2) >>> set1 {1, 3} >>> set1.discard(4) {1, 3} |
intersection() | set3 = set1.intersection(set2) | 取 set1 和 set2 的交集给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.intersection(set2) >>> set3 {3} |
intersection_update() | set1.intersection_update(set2) | 取 set1和 set2 的交集,并更新给 set1 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.intersection_update(set2) >>> set1 {3} |
isdisjoint() | set1.isdisjoint(set2) | 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.isdisjoint(set2) False |
issubset() | set1.issubset(set2) | 判断 set1 是否是 set2 的子集 | >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issubset(set2) False |
issuperset() | set1.issuperset(set2) | 判断 set2 是否是 set1 的子集 | >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issuperset(set2) True |
pop() | a = set1.pop() | 取 set1 中一个元素,并赋值给 a | >>> set1 = {1,2,3} >>> a = set1.pop() >>> set1 {2,3} >>> a 1 |
remove() | set1.remove(elem) | 移除 set1 中的 elem 元素 | >>> set1 = {1,2,3} >>> set1.remove(2) >>> set1 {1, 3} >>> set1.remove(4) Traceback (most recent call last): File “ |
symmetric_difference() | set3 = set1.symmetric_difference(set2) | 取 set1 和 set2 中互不相同的元素,给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.symmetric_difference(set2) >>> set3 {1, 2, 4} |
symmetric_difference_update() | set1.symmetric_difference_update(set2) | 取 set1 和 set2 中互不相同的元素,并更新给 set1 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.symmetric_difference_update(set2) >>> set1 {1, 2, 4} |
union() | set3 = set1.union(set2) | 取 set1 和 set2 的并集,赋给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3=set1.union(set2) >>> set3 {1, 2, 3, 4} |
update() | set1.update(elem) | 添加列表或集合中的元素到 set1 |
Python frozenset集合
set 集合是可变序列,程序可以改变序列中的元素;
frozenset 集合是不可变序列,程序不能改变序列中的元素。set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。
- frozenset 集合的这些方法和 set 集合中同名方法的功能是一样的。
也就是说,frozenset 集合是set集合的不可变版本
。那么什么时候使用f集合呢?
两种情况下可以使用 fronzenset:
- 当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。
- 有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。
1 | 实例 |
实例解读
set 集合本身的元素必须是不可变的, 所以 set 的元素不能是 set,只能是 frozenset。代码向 set 中添加 frozenset 是没问题的,因为 frozenset 是不可变的;但是,代码中尝试向 set 中添加子 set,这是不允许的,因为 set 是可变的。
解读字典为何高效
C#学了哈希冲突,没错,就是由基础哈希表改进而来,
- 对于字典而言,这张表存储了哈希值(hash)、键和值这 3 个元素。
- 而对集合来说,哈希表内只存储单一的元素。
哈希表插入数据
- 当向字典中插入数据时,Python 会首先根据键(key)计算出对应的哈希值(通过 hash(key) 函数),而向集合中插入数据时,Python会根据该元素本身计算对应的哈希值(通过 hash(valuse) 函数)。
1 | 实例 |
如果哈希表中此位置是空的,那么此元素就可以直接插入其中;反之,如果此位置已被其他元素占用,那么 Python 会比较这两个元素的哈希值和键是否相等:
- 如果相等,则表明该元素已经存在,再比较他们的值,不相等就进行更新;
- 如果不相等,这种情况称为哈希冲突(即两个元素的键不同,但求得的哈希值相同)。这种情况下,Python 会使用开放定址法、再哈希法等继续寻找哈希表中空余的位置,直到找到位置。
哈希表查找数据
在哈希表中查找数据,和插入操作类似,Python 会根据哈希值,找到该元素应该存储到哈希表中的位置,然后和该位置的元素比较其哈希值和键(集合直接比较元素值):
- 如果相等,则证明找到;
- 反之,则证明当初存储该元素时,遇到了哈希冲突,需要继续使用当初解决哈希冲突的方法进行查找,直到找到该元素或者找到空位为止。
这里的找到空位,表示哈希表中没有存储目标元素。
哈希表删除数据
对于删除操作,Python 会暂时对这个位置的元素赋于一个特殊的值,等到重新调整哈希表的大小时,再将其删除。
需要注意的是,哈希冲突的发生往往会降低字典和集合操作的速度。因此,为了保证其高效性,字典和集合内的哈希表,通常会保证其至少留有 1/3 的剩余空间。随着元素的不停插入,当剩余空间小于 1/3 时,Python 会重新获取更大的内存空间,扩充哈希表,与此同时,表内所有的元素位置都会被重新排放。
虽然哈希冲突和哈希表大小的调整,都会导致速度减缓,但是这种情况发生的次数极少。所以,平均情况下,仍能保证插入、查找和删除的时间复杂度为 O(1)
。
Python字符串常用方法
Python字符串拼接
1 | strname = "str1" "str2" //str'_'为内容 |
字符串和数字的拼接
是不允许字符串与数字直接拼接,需要将数字类型改编为字符串
1 | 借助 str() 和 repr() 函数将数字转换为字符串,它们的使用格式为: |
str() 和 repr() 函数虽然都可以将数字转换成字符串,但它们之间是有区别的:
- str() 用于将数据转换成适合人类阅读的字符串形式。
- repr() 用于将数据转换成适合解释器阅读的字符串形式(Python 表达式的形式),适合在开发和调试阶段使用;如果没有等价的语法,则会发生 SyntaxError 异常。
截取字符串
获取单个字符
依靠索引截取需要的字符串。
1 | strname[index] |
Python 允许从字符串的两端使用索引:(可以作为前面的补充)
当以字符串的左端(字符串的开头)为起点时,索引是从 0 开始计数的;字符串的第一个字符的索引为 0,第二个字符的索引为 1,第三个字符串的索引为 2 ……
当以字符串的右端(字符串的末尾)为起点时,索引是从 -1 开始计数的;字符串的倒数第一个字符的索引为 -1,倒数第二个字符的索引为 -2,倒数第三个字符的索引为 -3 ……
获取多个字符(字符串截去/字符串切片)
1 | strname[start : end : step] |
len()函数:获取字符串长度或字节数
1 | >>> a='http://c.biancheng.net' |
split():分割字符串
1 | str.split(sep,maxsplit) |
join():合并字符串
1 | newstr = str.join(iterable) |
count():统计字符串出现的次数
1 | str.count(sub[,start[,end]]) |
find()方法:检测字符串中是否包含某子串
1 | str.find(sub[,start[,end]]) |
index()方法:检测字符串中是否包含某子串
1 | str.index(sub[,start[,end]]) |
ljust()、rjust()和center(),字符串对齐方法
1 | 输出对齐,皆有参考 |
startswith()和endswith()检索指定字符串方法,
1 | str.startswith(sub[,start[,end]]) |
1 | str.endswith(sub[,start[,end]]) |
title()、lower() 和 upper()。大小写转换函数
1 | title() 方法的语法格式如下: |
1 | lower() 方法的语法格式如下: |
1 | upper() 方法的语法格式如下: |
去除字符串中空格的3种方法(删除指定字符)
1 | Python 中,字符串变量提供了 3 种方法来删除字符串中多余的空格和特殊字符,它们分别是: |
注意,Python 的 str 是不可变的(不可变的意思是指,字符串一旦形成,它所包含的字符序列就不能发生任何改变),因此这三个方法只是返回字符串前面或后面空白被删除之后的副本,并不会改变字符串本身。
1 | strip() 方法用于删除字符串左右两个的空格和特殊字符,该方法的语法格式为: |
1 | lstrip() 方法用于去掉字符串左侧的空格和特殊字符。该方法的语法格式如下: |
1 | rstrip() 方法用于删除字符串右侧的空格和特殊字符,其语法格式为: |
format()格式化输出
1 | http://c.biancheng.net/view/4301.html |
encode()和decode()方法,字符串编码转换
1 | http://c.biancheng.net/view/4305.html |
1 | decode() 方法的语法格式如下: |
注意,格式中用 [] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [] 中的参数,也可以不使用。
dir()和help()帮助函数
1 | Python dir() 函数用来列出某个类或者某个模块中的全部内容,包括变量、方法、函数和类等,它的用法为: |
1 | help(obj) |
Python流程控制
在机房看完了,注意基础编程知识,算法基础等。
Python函数及lambda
终于进入到核心了,加油,不要做无用功。
Python函数(函数定义、函数调用)用法详解
Python函数的定义
point:
1 | def 函数名(参数列表): |
此格式中,各部分参数的含义如下:
- 函数名:其实就是一个符合 Python 语法的标识符,但不建议读者使用 a、b、c 这类简单的标识符作为函数名,函数名最好能够体现出该函数的功能(如上面的 my_len,即表示我们自定义的 len() 函数)。
- 形参列表:设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。
- [return [返回值] ]:整体作为函数的可选参参数,用于设置该函数的返回值。也就是说,一个函数,可以用返回值,也可以没有返回值,是否需要根据实际情况而定。
Python函数的调用
1 | [返回值] = 函数名([形参值]) |
为函数提供说明文档
1 | #定义一个比较字符串大小的函数 |
Python函数值传递和引用传递
穿插一下记录,
操作系统使用到numpy类,是一个开源的python计算库。
https://www.cnblogs.com/lemonbit/p/7043879.html
Python作业记录
1 | datetime类(使用replace取消部分数值输出(print),数值仍存在,但是不会影响.second等计算时间差函数使用) |
1 | __init__函数:两个下划线开头的函数是声明该属性为私有,也称之为初始化函数 |
Python是面向对象,也是动态语言,可以定义对象
Python类和对象
面向对象
面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法。封装代码有很多种方法,把常用的功能写成函数,仅仅留一个接口供调用,这也是一种封装,把数据丢入列表也是。只不过,这次的封装,更加高级。
面向对象相关术语(相当基础也很重要,这里我已经有点忘记对象的定义了,这里介绍真的好棒,对于我这种代码呆c来说真的很有帮助)
在系统学习面向对象编程之前,初学者要了解有关面向对象的一些术语。当和其他人讨论代码的时候,或者尝试查找我们遇到的问题的解决方案时,知道正确的术语会很有帮助。
面向对象中,常用术语包括:
- 类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。
- 对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用](http://c.biancheng.net/view/4512.html))。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。
- 属性:类中的所有变量称为属性。例如,tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。
- 方法:类中的所有函数通常称为方法。不过,和函数所有不同的是,类方法至少要包含一个 self 参数(后续会做详细介绍)。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。
python定义类](http://c.biancheng.net/view/4519.html))
制作图纸,再通过图纸制造出来的物品(也就是实例对象才可使用)
类属性指的就是包含在类中的变量;而类方法指的是包含类中的函数*:类属性和类方法其实分别是包含类中的变量和函数的别称**
- 同属一个类的所有类属性和类方法,要保持统一的缩进格式,通常统一缩进 4 个空格(tab)
关键字class用来表示类的操作:
1 | class classname: //起名注意代码可读性,这我一直都是按照简写 |
Python init()类构造方法类构造方法 (biancheng.net)](http://c.biancheng.net/view/4533.html))
在创建类时,我们可以手动添加一个 init() 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)
1
2def __init__(self,...): //两个下划线开头的函数是声明该属性为私有
代码块init() 方法可以包含多个参数,但必须包含一个名为 self 的参数(通常会直接给出),且必须作为第一个参数self ,self不需要手动传递参数。
创建一个对象
1
2
3
4
5class tfd():
def __init__(self,...):
#顶头写
对象name = tfd() //创建一个属于tfd()的对象
Python类对象的创建和使用
创建类对象的过程,又称为类的实例化。也就是可以使用的事物
定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。
类变量(类属性):位于类内,不位于类方法内;实例变量(~属性):定义在类方法内
```
实例化后的类对象可以执行以下操作:
访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。1
2
- python类对象的使用(作用):对象name.变量名 //可以添加一个变量
对象name.一个全新的变量 //就是添加给类对象添加一个变量了
del 对象name.一个全新的变量 //就是删除刚刚动态添加的变量
对象name.方法名(参数)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
实例:
```python
class CLanguage :
# 下面定义了2个类变量,可有可无,因为下面还是手动输一次
name = "C语言中文网"
add = "http://c.biancheng.net"
def __init__(self,name,add):
#下面定义 2 个实例变量
self.name = name
self.add = add
print(name,add)
# 下面定义了一个say实例方法,没啥难理解的,也就是说出你刚刚输入的话罢了
def say(self, content):
print(content)
# 将该CLanguage对象赋给clanguage变量
clanguage = CLanguage("C语言中文网","http://c.biancheng.net")
#输出name和add实例变量的值
print(clanguage.name,clanguage.add)
#修改实例变量的值
clanguage.name="Python教程"
clanguage.add="http://c.biancheng.net/python"
#调用clanguage的say()方法
clanguage.say("人生苦短,我用Python")
#再次输出name和add的值
print(clanguage.name,clanguage.add)
输出:
C语言中文网 http://c.biancheng.net
C语言中文网 http://c.biancheng.net
人生苦短,我用Python
Python教程 http://c.biancheng.net/python
2022/4/10,工具找的差不多了,其实这也是我给我自己不想学语言找的理由,我其实想当医生,我个人认为我在医学上会有一番建树,无奈考试落榜,对于代码,有点看不懂,但是我认为还有一些因素,我还不确定,我这次会努力点不变成代码白痴,多练习!
继续学习,尽量不浪费太多时间在做笔记上,那些记下来也会忘记,再想看我也不会来博客看,所以做笔记我打算要以自己的总结为主,纠正我之前的错误。
目标:自己写脚本,看得懂别人的脚本
突然想去直接看学习总结,或许是更快的方法,我觉得还不错,现在去看看爬虫怎么写,用一下scrapy写
爬虫Scrapy
最好在python目录的script下
1 | pip install scrapy |
然后桌面命令行
1 | scrapy startproject wikispider |
就可以创建一个爬虫的根文件夹了
然后去setting.py改一下你需要的配置,然后cmd走一波命令,或者自己调试一下在pycharm也可跑
PTA刷题
由于leecode有点难,我跑去pta刷题了,但是没有权限,只可以看题目,不过也够了,争取刷快点吧,因为哪怕上面记得再多也不是我的, 我基本没有实战过写过,所以还得是刷题
.split():以空格为分隔符,输入的时候可以分,输出也可分!
sum
range
.format()函数:规范输出,指明输出值https://m.php.cn/article/471817.html
很神奇,多打打
1 | x=float(input()) |
int()函数:int(a*i)=9+i位本身=99(i=1),怎么说呢,a+aa+aaa,就是靠这个实现
第2章-4 特殊a串数列求和 (20 分)
1
2
3
4
5a,n=input().split() #连续输入,间隔为一个空格
n,s=int(n),0 #s=0,n必须这么写,不然range识别不到
for i in range(1,n+1): #range(9)=默认0-9
s=s+int(a*i)
print("sum = %d"%s)
map函数
第2章-7 产生每位数字相同的n位数 (30 分)
a,b=input().split(',')#也可写 a,b=map(int,input().split(',')) a,b=int(a),int(b) print(str(a)*b)
eval函数:https://blog.csdn.net/chen_zan_yu_/article/details/103339750
...
...
本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议 ,转载请注明出处!