IPython

简介

一个python的交互式shell,比默认的python shell要好用的多

特性

  1. 自动补全代码(按下tab)
  2. 自动缩进
  3. 支持bash shell命令
  4. 内置了很多有用的功能和函数
  5. 使用%run命令运行脚本
  6. 使用%timeit命令快速测量时间
  7. 使用%pdb命令快速debug
  8. 使用pylab进行交互计算
  9. 使用IPython Notebook

    安装

    首先确保已经安装了python,在cmd键入命令“python”查看是否已安装;然后输入如下命令进行ipython安装

    pip install ipython

使用

进入ipython图形化界面

键入命令:

ipython qtconsole

不过现在官方已经不建议使用该命令了,推荐如下命令进入jupyter图形化界面:

jupyter qtconsole

对象内省

通过在变量的前面或者后面加上问号?,就可以将该对象的一些通用信息显示出来
image.png
同样也可以查看方法的一些通用信息
image.png

查看历史命令

通过键入如下命令即可查看当前console中输入的历史命令

hist # 或者 history

通过加入 -n 参数可以显示出输入的序号:

hist -n

image.png

%run运行脚本

%run 路径 + python文件名

%timeit快速测量代码运行时间

%timeit [x * x for x in range(1000)]

%pdb激活ipython调试器

使用notebook

通过键入命令会打开ipython notebook,不过官方已经自动转向 jupyter notebook了:

ipython notebook # 与命令 jupyter notebook 执行结果一样

在notebook中通过如下两个操作都可以运行脚本:

shift + enter:执行当前输入框命令,同时会新建一个新的输入框,并将光标移动到新的输入框

ctrl + enter:执行当前输入框命令,不会新建一个新的输入框

面向对象前置学习

注释

单行注释

通过#号来编写单行注释

这是一个单行注释

多行注释

通过三个引号进行包裹

‘’’ 慈母手中线,游子身上衣 临行密密缝,意恐迟迟归 ‘’’

也可以通过三个双引号进行包裹

“”” 锄禾日当午,汗滴禾下土 谁知盘中餐,粒粒皆辛苦 “””

数组

一维数组切片

切片格式:arr[startIdx: endIdx]

考虑如下场景:

  1. startIdx > endIdx:此时取值:[startIdx, endIdx-1]
  2. startIdx < endIdx:此时返回空数组

如果索引值小于0,则表示从最后的索引位置开始计算,其中-1表示最后一个元素

  1. import numpy as np
  2. if __name__ == "__main__":
  3. seq_number = np.array(
  4. [112., 118., 132., 129., 121., 135., 148., 148., 136., 119., 104.,
  5. 118., 115., 126., 141., 135., 125., 149., 170., 170., 158., 133.,
  6. 114., 140., 145., 150., 178., 163., 172., 178., 199., 199., 184.,
  7. 162., 146., 166., 171., 180., 193., 181., 183., 218., 230., 242.,
  8. 209., 191., 172., 194., 196., 196., 236., 235., 229., 243., 264.,
  9. 272., 237., 211., 180., 201., 204., 188., 235., 227., 234., 264.,
  10. 302., 293., 259., 229., 203., 229., 242., 233., 267., 269., 270.,
  11. 315., 364., 347., 312., 274., 237., 278., 284., 277., 317., 313.,
  12. 318., 374., 413., 405., 355., 306., 271., 306., 315., 301., 356.,
  13. 348., 355., 422., 465., 467., 404., 347., 305., 336., 340., 318.,
  14. 362., 348., 363., 435., 491., 505., 404., 359., 310., 337., 360.,
  15. 342., 406., 396., 420., 472., 548., 559., 463., 407., 362., 405.,
  16. 417., 391., 419., 461., 472., 535., 622., 606., 508., 461., 390.,
  17. 432.], dtype=np.float32)
  18. print(seq_number[0: 5])
  19. print(seq_number[1:0])
  20. print(seq_number[-5: -1])
  21. print(seq_number[-1: -5])

打印结果:

  1. [112. 118. 132. 129. 121.]
  2. []
  3. [606. 508. 461. 390.]
  4. []

二维数组切片

切片格式:arr[rowStart:rowEnd, colStart:colEnd]

其中:rowStart和rowEnd用于指定行取值范围,colStart和colEnd用于指定列取值范围

  1. import numpy as np
  2. if __name__ == "__main__":
  3. seq_number = np.array(
  4. [112., 118., 132., 129., 121., 135., 148., 148., 136., 119., 104.,
  5. 118., 115., 126., 141., 135., 125., 149., 170., 170., 158., 133.,
  6. 114., 140., 145., 150., 178., 163., 172., 178., 199., 199., 184.,
  7. 162., 146., 166., 171., 180., 193., 181., 183., 218., 230., 242.,
  8. 209., 191., 172., 194., 196., 196., 236., 235., 229., 243., 264.,
  9. 272., 237., 211., 180., 201., 204., 188., 235., 227., 234., 264.,
  10. 302., 293., 259., 229., 203., 229., 242., 233., 267., 269., 270.,
  11. 315., 364., 347., 312., 274., 237., 278., 284., 277., 317., 313.,
  12. 318., 374., 413., 405., 355., 306., 271., 306., 315., 301., 356.,
  13. 348., 355., 422., 465., 467., 404., 347., 305., 336., 340., 318.,
  14. 362., 348., 363., 435., 491., 505., 404., 359., 310., 337., 360.,
  15. 342., 406., 396., 420., 472., 548., 559., 463., 407., 362., 405.,
  16. 417., 391., 419., 461., 472., 535., 622., 606., 508., 461., 390.,
  17. 432.], dtype=np.float32)
  18. seq_number = seq_number[:, np.newaxis]
  19. seq_year = np.arange(12)
  20. seq_month = np.arange(12)
  21. seq_year_month = np.transpose(
  22. [np.repeat(seq_year, len(seq_month)),
  23. np.tile(seq_month, len(seq_year))],
  24. ) # Cartesian Product
  25. seq = np.concatenate((seq_number, seq_year_month), axis=1)
  26. print("--------------origin data-------------")
  27. print(seq)
  28. print("---------------split data--------------")
  29. print(seq[0:3, 0:2])
  30. print("--------------split data2----------------")
  31. print(seq[0:3, 0])

打印结果:

  1. --------------origin data-------------
  2. [[112. 0. 0.]
  3. [118. 0. 1.]
  4. [132. 0. 2.]
  5. [129. 0. 3.]
  6. [121. 0. 4.]
  7. [135. 0. 5.]
  8. [148. 0. 6.]
  9. [148. 0. 7.]
  10. [136. 0. 8.]
  11. [119. 0. 9.]
  12. [104. 0. 10.]
  13. [118. 0. 11.]
  14. [115. 1. 0.]
  15. [126. 1. 1.]
  16. [141. 1. 2.]
  17. [135. 1. 3.]
  18. [125. 1. 4.]
  19. [149. 1. 5.]
  20. [170. 1. 6.]
  21. [170. 1. 7.]
  22. [158. 1. 8.]
  23. [133. 1. 9.]
  24. [114. 1. 10.]
  25. [140. 1. 11.]
  26. [145. 2. 0.]
  27. [150. 2. 1.]
  28. [178. 2. 2.]
  29. [163. 2. 3.]
  30. [172. 2. 4.]
  31. [178. 2. 5.]
  32. [199. 2. 6.]
  33. [199. 2. 7.]
  34. [184. 2. 8.]
  35. [162. 2. 9.]
  36. [146. 2. 10.]
  37. [166. 2. 11.]
  38. [171. 3. 0.]
  39. [180. 3. 1.]
  40. [193. 3. 2.]
  41. [181. 3. 3.]
  42. [183. 3. 4.]
  43. [218. 3. 5.]
  44. [230. 3. 6.]
  45. [242. 3. 7.]
  46. [209. 3. 8.]
  47. [191. 3. 9.]
  48. [172. 3. 10.]
  49. [194. 3. 11.]
  50. [196. 4. 0.]
  51. [196. 4. 1.]
  52. [236. 4. 2.]
  53. [235. 4. 3.]
  54. [229. 4. 4.]
  55. [243. 4. 5.]
  56. [264. 4. 6.]
  57. [272. 4. 7.]
  58. [237. 4. 8.]
  59. [211. 4. 9.]
  60. [180. 4. 10.]
  61. [201. 4. 11.]
  62. [204. 5. 0.]
  63. [188. 5. 1.]
  64. [235. 5. 2.]
  65. [227. 5. 3.]
  66. [234. 5. 4.]
  67. [264. 5. 5.]
  68. [302. 5. 6.]
  69. [293. 5. 7.]
  70. [259. 5. 8.]
  71. [229. 5. 9.]
  72. [203. 5. 10.]
  73. [229. 5. 11.]
  74. [242. 6. 0.]
  75. [233. 6. 1.]
  76. [267. 6. 2.]
  77. [269. 6. 3.]
  78. [270. 6. 4.]
  79. [315. 6. 5.]
  80. [364. 6. 6.]
  81. [347. 6. 7.]
  82. [312. 6. 8.]
  83. [274. 6. 9.]
  84. [237. 6. 10.]
  85. [278. 6. 11.]
  86. [284. 7. 0.]
  87. [277. 7. 1.]
  88. [317. 7. 2.]
  89. [313. 7. 3.]
  90. [318. 7. 4.]
  91. [374. 7. 5.]
  92. [413. 7. 6.]
  93. [405. 7. 7.]
  94. [355. 7. 8.]
  95. [306. 7. 9.]
  96. [271. 7. 10.]
  97. [306. 7. 11.]
  98. [315. 8. 0.]
  99. [301. 8. 1.]
  100. [356. 8. 2.]
  101. [348. 8. 3.]
  102. [355. 8. 4.]
  103. [422. 8. 5.]
  104. [465. 8. 6.]
  105. [467. 8. 7.]
  106. [404. 8. 8.]
  107. [347. 8. 9.]
  108. [305. 8. 10.]
  109. [336. 8. 11.]
  110. [340. 9. 0.]
  111. [318. 9. 1.]
  112. [362. 9. 2.]
  113. [348. 9. 3.]
  114. [363. 9. 4.]
  115. [435. 9. 5.]
  116. [491. 9. 6.]
  117. [505. 9. 7.]
  118. [404. 9. 8.]
  119. [359. 9. 9.]
  120. [310. 9. 10.]
  121. [337. 9. 11.]
  122. [360. 10. 0.]
  123. [342. 10. 1.]
  124. [406. 10. 2.]
  125. [396. 10. 3.]
  126. [420. 10. 4.]
  127. [472. 10. 5.]
  128. [548. 10. 6.]
  129. [559. 10. 7.]
  130. [463. 10. 8.]
  131. [407. 10. 9.]
  132. [362. 10. 10.]
  133. [405. 10. 11.]
  134. [417. 11. 0.]
  135. [391. 11. 1.]
  136. [419. 11. 2.]
  137. [461. 11. 3.]
  138. [472. 11. 4.]
  139. [535. 11. 5.]
  140. [622. 11. 6.]
  141. [606. 11. 7.]
  142. [508. 11. 8.]
  143. [461. 11. 9.]
  144. [390. 11. 10.]
  145. [432. 11. 11.]]
  146. ---------------split data--------------
  147. [[112. 0.]
  148. [118. 0.]
  149. [132. 0.]]
  150. --------------split data2----------------
  151. [112. 118. 132.]

python常用函数

用户输入函数

input函数用于接收用户输入,格式为:

该方法会返回一个String类型

input(“输入提示信息:”)

输出函数

print函数用于输出到终端,格式为:

print(“welcome to China”);

同时可以对输出的内容进行格式化,常用的有三种:

%s 字符串 %d 整数 %f 浮点数

常用类型转换函数

函数名称 函数作用
int(string) 将字符串转换成整数
fload(string) 将字符串转换成浮点数

流程控制语句

if - elif -else

  1. age = int(input("请输入您的年龄:"))
  2. if age < 10:
  3. print("小屁孩")
  4. elif age < 16:
  5. print("未成年人")
  6. elif age < 30:
  7. print("中年人")
  8. else:
  9. print("这是啥")

while

  1. count = int(input("请输入循环次数:"))
  2. while count> 0:
  3. print("循环剩余%d次"%(count))
  4. count = count-1

do-while

与while类似,不过是先执行,后判断循环条件

自定义函数

定义

函数的定义格式:

def fun_name(arg1, arg2, …): fun_body return var1, var2,…

调用

函数的调用:

fun_name(my_arg1, my_arg2,…)

函数缺省参数

即定义函数参数的同时,为其指定一个默认值,具有默认值的参数就叫做缺省参数

  1. def fun(name, age, type=1):
  2. ...
  3. fun("JreamY", 20, type=2);
  4. fun("wangzhun", 20);

函数多值参数

在定义函数的时候可能无法确定需要传递的参数个数,这时候可以将参数定义为多值参数

定义格式分为两种:

  1. 参数名前增加一个*,表示接收元组
  2. 参数名前增加一个**,表示接受字典

一般习惯性以下列两个名字对应命名:

  1. *args
  2. **kwargs

示例:

  1. def fun(name, *args, **kwargs):
  2. print(name)
  3. print(args)
  4. print(kwargs)
  5. return
  6. fun("JreamY", 2, 3, 4, 5, age=20, gender="man")

image.png

函数返回值

一个函数可以返回多个值,默认是元组的形式

  1. def fun():
  2. name = "JreamY"
  3. age = 20
  4. return name, age
  5. result = fun()
  6. # 将会输出tuple
  7. print(type(result))

高级变量

基础变量回顾

类型 名称 作用
int 整形 整数
float 浮点型 浮点数
bool 布尔型 true=非0,false=0
complex 复数型 用于科学计算等场景

列表

概念

python中定义最频繁的数据类型,在其他语言中通常叫做数组

定义

定义格式:

list_name = [ele1, ele2, …]

列表的索引从0开始计数

常用操作

取值:

list_name[ele_idx]

在ipython中输入下列命令然后按下tab键就可以查看操作列表,即其可以使用的方法列表:

list_name. # 然后按下tab键

image.png

操作类型 操作说明
list.insert(idx, data) 在指定位置插入数据
list.append(data) 在末尾追加数据
list[idx] = data 直接修改数据
del list[idx] 删除指定位置数据
list.remove(data) 删除第一个出现的指定数据
list.pop() 删除末尾数据
list.pop(idx) 删除指定位置数据
list.clear() 清空列表
len(list) 获取列表长度
list.count(data) 获取数据在列表中出现的次数
list.sort() 列表升序
list.sort(reverse = True) 列表降序
list.reverse() 列表反转

遍历列表

遍历格式:

for ele in list_name: for_body

元组

概念

元组和列表类似,不同之处在于元组里面的元素不能修改

定义

tuple_name = {ele1, ele2, …}

当创建只包含一个元素的元组时,需要在元素后面添加逗号

tuple_name = {ele1,}

常用操作

image.png

操作类型 操作说明
tuple_name[idx] 获取指定位置的数据
tuple_name.index(data) 获取指定数据对应的位置
tuple_name.count(data) 统计指定数据在元组中出现的次数

遍历元组

for ele in tuple: for_body

元组和列表转换

list转换为tuple

list(tuple_name)

tuple转换为list

tuple(list_name)

字典

概念

除列表以外Python中最灵活的数据类型,类似于java中的Map数据类型
字典里面的元素是无序的
字典里面的key必须是唯一的,且只能使用字符串、数字或者元组作为键值

定义

dict = {key1: val1, key2: val2}

常用操作

image.png

操作类型 操作说明
dict[key] 获取指定key对应的值(如果key不存在,会报错)
dict[key] = value 增加、修改相应key的值
dict.setdefault(key, value) 增加元素,如果对应的key存在则不会新增
dict.pop(key) 删除指定key对应的元素(如果key不存在,会报错)
del dict(key) 删除指定key对应的元素(如果key不存在,会报错)
len(dict) 获取字典的元素长度
dict1.update(dict2) 将dict2的键值对更新/添加到dict1中
dict.clear() 清空字典

遍历字典

for key in dict: key = k value = dict[k] for_body

字符串

定义

一对单引号或者一对双引号即可定义,建议使用双引号:

str1 = ‘welcome’ str2 = “welcome”

常用操作

操作类型 操作说明
len(str) 获取字符串的长度
str.count(str2) 获取str2字符串在str中出现的次数
str[idx] 获取指定位置的字符
str.index(str2) 获取str2在str中第一次出现的位置
方法 描述
string.capitalize() 把字符串的第一个字符大写
string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string.decode(encoding=’UTF-8’, errors=’strict’) 以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除非 errors 指 定 的 是 ‘ignore’ 或 者’replace’
string.encode(encoding=’UTF-8’, errors=’strict’) 以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
string.endswith(obj, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
string.expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
string.find(str, beg=0, end=len(string)) 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
string.format() 格式化字符串
string.index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在 string中会报一个异常.
string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返
回 True,否则返回 False
string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True,
否则返回 False
string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False.
string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False.
string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
string.isnumeric() 如果 string 中只包含数字字符,则返回 True,否则返回 False
string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False.
string.istitle() 如果 string 是标题化的(见 title())则返回 True,否则返回 False
string.isupper() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
string.join(seq) 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.lower() 转换 string 中所有大写字符为小写.
string.lstrip() 截掉 string 左边的空格
string.maketrans(intab, outtab]) maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
max(str) 返回字符串 str 中最大的字母。
min(str) 返回字符串 str 中最小的字母。
string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
string.rfind(str, beg=0,end=len(string) ) 类似于 find() 函数,返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。
string.rindex( str, beg=0,end=len(string)) 类似于 index(),不过是返回最后一个匹配到的子字符串的索引号。
string.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.rpartition(str) 类似于 partition()函数,不过是从右边开始查找
string.rstrip() 删除 string 字符串末尾的空格.
string.split(str=””, num=string.count(str)) 以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+1 个子字符串
string.splitlines([keepends]) 按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
string.startswith(obj, beg=0,end=len(string)) 检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
string.strip([obj]) 在 string 上执行 lstrip()和 rstrip()
string.swapcase() 翻转 string 中的大小写
string.title() 返回”标题化”的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
string.translate(str, del=””) 根据 str 给出的表(包含 256 个字符)转换 string 的字符,
要过滤掉的字符放到 del 参数中
string.upper() 转换 string 中的小写字母为大写
string.zfill(width) 返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

公共方法

python对高级变量提供的内置函数:

函数 描述 备注
len(item) 计算容器中元素的个数
del(item) 删除变量(从内存中删除)
max(item) 返回容器中元素的最大值 如果是字典,只针对key进行比较
min(item) 返回容器中元素的最小值 如果是字典,只针对key进行比较

切片

支持的数据类型:字符串、列表、元组
切片格式:

data[start:end:step] # 最终结果:[start, end) step默认步长为1

运算符

运算符 描述 支持的数据类型
+ 合并 字符串、列表、元组
* 重复 字符串、列表、元组
in 元素是否被包含 字符串、列表、元组、字典
not in 元素是否不被包含 字符串、列表、元组、字典
>/>=/==/</<= 元素比较 字符串、列表、元组

完整的for循环语法

  1. for var in collection:
  2. for_body
  3. else:
  4. # 如果不是因为执行了break而退出的循环,就会执行这块代码,否则不会执行
  5. else_body

局部变量和全局变量

局部变量

在函数内部定义的变量

全局变量

在函数外部定义的变量

在函数内部中获取/修改全局变量

通过global关键字引用变量,表示该变量使用的是全局变量

  1. num = "JreamY"
  2. def fun():
  3. global num
  4. num = "wangzhun"
  5. fun()

面向对象学习

dir内置函数

用于获取对象的所有属性和方法

使用格式:

dir(object)

定义

类设计三要素:

  1. 类名:大驼峰命名法
  2. 属性:类具有的特征
  3. 方法:类具有的行为

定义格式:

class class_name:

def fun_name(self, arg1, arg2): ‘’’ function body ‘’’

类中定义方法的格式与函数大致一样,区别在于第一个参数必须是self,代表的是当前调用对象

创建对象

创建语法:

object_name = class_name()

创建对象时,会自动执行以下操作:

  1. 为对象在内存中分配空间 - 创建对象 (new)
  2. 为对象的属性设置初始值 - 初始化方法(init)

    对象创建方法 new

    通过重写该方法用于实现单例模式生成类对象
  1. class MyCls(object):
  2. instance = None
  3. def __new__(cls, *args, **kwargs):
  4. if(instance is None) {
  5. instance = super().__new__(cls)
  6. }
  7. return instance
  8. def __init__(self):
  9. ''' init method body '''

初始化方法 init

对象的内置方法,专门用于定义一个类具有哪些属性

格式:

def init(self): ‘’’ do something init object’’’

在初始化方法中定义属性:

  1. class MyCls:
  2. def __init__(self):
  3. self.name = "JreamY"
  4. ''' 创建对象 '''
  5. cls = MyCls()
  6. class MyCls2:
  7. def __init__(self, name):
  8. self.name = name
  9. # 也可以暂时设置值为空值
  10. self.age = None
  11. ''' 创建对象 '''
  12. cls2 = MyCls2("JreamY")

对象销毁前置方法del

当对象从内存中销毁之前,会自动调用该方法

格式:

def del(self): ‘’’ do something ‘’’

打印对象信息方法str

类似于Java中的toString方法

格式:

def str(self): ‘’’ do something ‘’’

可调用对象生成方法call

存在call方法的对象被称为可调用对象,可以直接通过对象名称进行调用,如下:

  1. class Cls(object):
  2. def __call__(self, name):
  3. print("my name is {}, print by call method".format(name))
  4. cls = Cls()
  5. cls("JreamY")

image.png

数组对象生成方法getitem

如果一个类中定义了getitem()方法,那么该类的实例对象cls就可以通过cls[idx]的形式进行取值,获取的结果与调用cls.getitem(idx)方法相同

getiem()方法使用示例:

  1. class Cls(object):
  2. # 定义一个列表数据
  3. arrs = []
  4. def __init__(self, arrs):
  5. self.arrs = arrs
  6. def __getitem__(self, index):
  7. return self.arrs[index]
  8. myarrs = ['wangzhun', 'zhunwang']
  9. cls = Cls(myarrs)
  10. print('one -> {}, two -> {}'.format(cls[0], cls[1]))

image.png

类说明信息打印属性doc

在类中编写的说明信息,可以通过该内置方法进行输出,如下:

  1. class Cls(object):
  2. '''
  3. print some thing about Cls info
  4. '''
  5. cls = Cls()
  6. print(cls.__doc__)

image.png

None属性值

当不确定属性值,同时又想定义类具有该属性时,可以通过如下格式定义:

class MyCls2:

  1. def __init__(self, name):
  2. self.name = name
  3. # 也可以暂时设置值为空值
  4. self.age = None

对属性值进行None校验,可以通过 == 或 is,python官方建议使用is:

cls.age is None # 返回True 或者False

属性、方法私有化

概念

某些属性或方法只希望在对象的内部被使用,而不希望被外部访问到

定义

通过在属性或者方法前面增加两个下划线,即表示定义的是私有属性或私有方法

class MyCls:

    def __init__(self, name):
        self.__name = name

    def __primethod(self):
        print("it is a private method")

伪私有化

在Python中,其实并没有将属性或者方法真正私有化,而是将带有__前缀的属性或方法进行了重命名

重命名的方式:在名称前面加上:_类名,最终仍然可以通过如下方式进行访问:

cls = MyCls()

cls._MyCls__primethod()

类属性和类方法定义

与实例属性通过self进行初始化不同,类属性通过类名进行初始化,格式为:

class MyCls:

    # 类属性定义
    count = 0

    def __init__(self, o_name):
        self.name = o_name
        MyCls.count += 1

    # 类方法定义 ,必须使用@classmethod修饰,同时方法的第一个参数为cls
    @classmethod
    def c_method_name(cls):
        ''' c_method body '''

继承

在Python中,一个类可以同时继承多个父类

需要注意的是:不同的父类之间不能出现同名的方法和属性

语法

class SubClass(SuperClass1, SuperClass2, SuperClass3): ‘’’ class body ‘’’

方法重写

同Java

子类方法中调用父类方法

通过super关键字进行调用

super().super_class_method()

也可以通过父类名进行调用,不过不推荐:

super_class_name.super_class_method()

mro属性

当一个类继承多个父类时,可通过该类属性来查看该类对应的对象的属性/方法查找顺序(从左往右)

示例:

class A:
    def fun1():
        pass

class B:
    def fun2():
        pass

class C(A, B):
    def fun():
        pass

print(C.__mro__)

image.png

异常

异常捕获语句块:try-except-else-finally

格式:

try: ‘’’ body ‘’’ except exp_type1: ‘’’ do somthing if accur exception ‘’’ except (exp_type2, exp_type3): ‘’’ do something if accur exception ‘’’ ‘’’ 捕获未知异常 ‘’’ except Exception as result: ‘’’ do something if accur exception ‘’’ ‘’’ 如果最终没有抛出异常,则会执行else里面的代码部分 ‘’’ else: ‘’’ do something if not accur exception ‘’’ ‘’’ 不管最终有没有抛出异常,都会执行finally里面的代码部分 ‘’’ finally: ‘’’ do something whether accur exception or not ‘’’

主动抛出异常

def num_check(num):
    if(num < 0) {
        raise Exception("数值必须大于等于0")
    }
    print("Pass")

文件

基本操作

函数/方法名称 作用描述
open 打开文件,返回文件操作对象
read 将文件内容一次性读取到内存
readline 一次读取一行内容
write 将指定内容写入到文件
close 关闭文件

操作示例

file = open("filename.txt")

text = file.read()

print(text)

file.close()

打开文件的方式

file = open(“文件路径”, “访问方式”)

访问方式有如下六种:

访问方式 说明


r
以只读方式打开文件,默认模式
不存在则抛出异常
文件指针在文件开头


w
以只写方式打开文件
不存在则创建
文件指针在文件开头


a
以追加方式打开文件
不存在则创建
文件指针在文件尾


r+
以读写形式打开文件
不存在则抛出异常
文件指针在文件开头


w+
以读写方式打开文件
不存在则会创建
文件指针在文件开头


a+
以读写方式打开文件
不存在则创建
文件指针在文件尾

readline使用

def readFile(filepath):

    file = open(filepath, r)

    while True:

        text = file.readline()

        if not text:
            break

        # 每一行的末尾本身就有换行符了,所以end可以设置为""不需要默认的"\n"了
        print(text, end="")