Python学习
先来个小栗子
在Python交互环境中实现:win+R
1 | # 画一个正方形(颜色自己定) |
1.基础
1. 输入: print()
单引号与双引号的区分不是很大,但输出时不可重复,重复时应用转义字符
1
2
3print('Hello,world!') 与 print("Hello,world!") # 结果是一样的
print('I\'m a student')
# 等同于 print("I'm a student") 反之亦然两个 print() 之间会自动换行,可以不用\n
print() 可以接受多个字符串,但中间要用逗号隔开,打印时,逗号会变为空格
eg.
print('Hello,','world') 打印值:Hello, world
可以直接输出数字,或计算结果
eg.
print(2020)
—>2020
print(2*5)
—>10
print(2,4)
—>2 4也可以多个输出,逗号一样变空格
可利用三重单引号或三重双引号进行多行输出,适用于一行太长的情况
eg.
print('''I\'m a student
I\'m very lazy''')
得:
I'm a student
I'm very lazy
当然,换行输出也可以用\n
2. 输入: input()
可以直接输入
eg.
name = input()
print(name)
也可以在
input()
里输入字符串,执行时input()
里的字符串会显示出来eg.
name = input("Please enter your name:")
print('Hello',name)
逗号不能少
3. 字符串
后缀:
后缀名 作用 .title()
输入字符串的首字母全大写 .lower()
输入字符串全小写 .upper()
输入字符串全大写
f 字符串
用法:string1=”…”, string2=”…” (单引号也行)
f"{string1} {string2}"
可以是多个字符串,也可以直接输入字符串,注意,空格也算
注:不是直接的字符串使用时要用大括号括起来
1
2
3
4first_name="ada"
last_name="lovelace"
full_name=f"{first_name} {last_name}"
print(f"Hello,{full_name.title()}!")得:
Hello,Ada Lovelace!
拓充:
f 字符串是在3.6版本引入的,在此之前是函数format()
,为一个后缀函数
用法为:full_name="{} {}".format(first_name,last_name)
字符串必须要单/双引号括起来,此处可以是多个字符串
转义字符
转义字符 作用 \n 换行 \r 回车 \b 退格 \ (在行尾时) 续航 (感觉跟三引号差不多) 栗子:
\b:
print("Hello!\b\b")
得:`Hell`
\ :
print('鬼\
灭\
之\
刃')
得:鬼灭之刃
可以用方括号截取字符串
eg.
name = "Hello,world"
print(name[0])
—>Hprint(name[0:5])
—>Hello //左闭右开,即 [0:5]是第零个到第四个字符注:0 也可以不写,即 [:5]是一样的
字符串运算符
字符 作用 栗子 打印结果 + 可以连接字符串 name="Hello,"
;print(name+'world!')
Hello,world!
***** 重复输出字符串 name="Hello"
;print(name\*2)
HelloHello
in 如果字符串中包含给定字符则返回 Ture,反之返回False name="Hello"
;print('H' in name)
True
not in 与 in相反 name="Hello"
;print('H' not in name)
False
r/ R 打印原始字符串 print('\n')
;print(r'\n')
换行\n 注:r/R 是在引号外,如果写在引号里就是打印 r/R了
(附)Python 小常识:
- 有复数型表示,即 3+5j 这样的,把数学中的 i变成了 j
- 变量的命名与 C相同,即字母、数字、下划线,其中数字不能开头
- 用
type()
可以检查变量类型 - print() 中用 %s等占位符时,后面不是用逗号,而是 %,因为用逗号会被认为是空格;如果有多个占位符,后面不要忘了加括号
- 两个字符串写在一起会自动拼接
- 字符串中打印 %要用 %%,打印 \要用 \\
- 逻辑运算中会有短路现象 (同 C)
input()
函数返回值都是字符串,故进行运算时应有强改
4. 布尔值(bool)
True 和 False 被定义为了关键字 但还是 1真 0假
1
2
3print(2>8)
print(4>2)
print(int(True),int(False))得:
False
和Ture
和1 0
布尔值可以进行逻辑运算
and , or , no
常见布尔值(False):
none
0 ,0.0 ,0.0+0.0j
空 (含 [] , (), {} , ‘’, “” )
5. 强改
形式 (有太多,就不全写了,格式都一样)
int()
float()
chr() # 字符
ord() # 将字符串转化为编码
str()、repr() # 字符串,但有一点区别1
2
3name='xiao shuang'
print(str(name)) --->xiao shuang
print(repr(name)) --->'xiao shuang'6. 运算符
符号 | 作用 | 栗子 |
---|---|---|
** | 指数 | 2**3=8 |
~ | 加1取反号 | ~4 = -5 |
^ | 异或 |
7. 后缀
后缀名 | 作用 |
---|---|
.rstrip() |
去除输入字符串末尾的空白 |
.lstrip() |
去除输入字符串开头的空白 |
.strip() |
去除输入字符串两边的空白 |
.capitalize() |
输入字符串第一个字符大写 |
max(str) |
返回 str中最大的字母 |
min(str) |
返回 str中最小的字母 |
补充实例:
1 | print('%.1f华氏度 = %.1摄氏度' % (f, c)) // f , c为常数 |
(补)基础知识:
- 任意两数相乘结果都是偶数,即使是两个整数,比如:
4/2 = 2.0
- 打印数字时下划线会被省略
- 注释是‘#’号,也可以用 ctrl+/ (注释整行)
8. 列表
- 许多特点与数组相似
1 | name = ['gui', 'mie', 'zhi', 'ren'] |
得:'gui'
注:可以与各函数一起用,如:name[1].title()
系列操作
- 修改:
1 | name = ['gui', 'mie', 'zhi', 'ren'] |
得:xiao
- 添加:
name = ['gui', 'mie', 'zhi', 'ren']
1 | name.append('xiao') # 直接在最后面添加元素 |
- 删除:
name = ['gui', 'mie', 'zhi', 'ren']
1 | del name[0] # 删除后无法再访问 |
区分:在知道索引的情况下,不需要删除值时可用 del ,需要则用 pop() ,而不知道索引时应用
remove()
- 排序:
name = ['gui', 'mie', 'zhi', 'ren']
1 | name.sort() # 永久排序,不能直接在括号里使用 |
得:['gui', 'mie', 'ren', 'zhi']
1 | sorted(name) # 临时排序 |
得:['gui', 'mie', 'zhi', 'ren']
和['gui', 'mie', 'ren', 'zhi']
1 | name.reverse() # 同 .sort(),不过是反向打印 |
得:['ren', 'zhi', 'mie', 'gui']
- 求长度
len()
1 | name = ['gui', 'mie', 'zhi', 'ren'] |
得:4
for 的应用
注:在Python中,for、if 之类的语句没有括号,是以缩进来判断是否在循环语句/判断语句中
1 | names = ['gui', 'mie', 'zhi', 'ren'] |
得:gui
mie
zhi
ren
- 快速创建列表
1 | for num in range(1,4): # 左闭右开 |
得:1
2
3
1 | num = list(range(1,4)) # list() 是转换为列表 |
得:[1, 2, 3]
- 解析列表 //就很厉害
1 | # 解析前 |
得:[1, 4, 9]
和[1, 4, 9]
- 切片
1 | name = ['gui', 'mie', 'zhi', 'ren'] |
得:['mie', 'zhi']
注:name[:3]
指从第一个到三个,name[1:]
指从第二个到最后一个,与数组有些相似,左闭右开
补充:在复制列表时应用切片,即:num = name[:]
,这样才能保证两个列表之间不会互相干扰;若直接用 num = name
,则这两个变量是指向同一个列表,一个改动另一个也会被影响
9. 元组
与列表十分相似,只是使用(),而且元组中的元素不允许像列表中的元素一样可以修改,也不能增添删减元素,但是可以重新赋值,见下例:
1 | name = ('gui', 'mie') |
得:('xiao', 'shuang')
- if-elif-else //写法有些不同
感觉跟 C没有太大差别,就是语法有些不同,多了in
、not in
、and
、or
等的应用,多练练就好了
2. 入门
1. 模块
可以只调用模块中的某一确定元素使用,比如:若这个文件中有很多函数(不止
make_pizza(size, *toppings)
)时,可以用from making_pizza import make_pizza, function_1, function_2
(举个例子)
这样在使用时不用再写后缀,直接make_pizza(12, pep)
调用模块时是直接调用这个模块里的所有函数代码
函数也可以重命名:
from making_pizza import make_pizza as mp
上面将
making_pizza
命名为了mp
,在import
中实现 (针对某一具体函数)同理,模块也可以重命名,见下面的例子
同样,也在import
中实现联系第三条,要调用模块里的所有函数可以用 *,即
from making_pizza import *
这时,也不需要后缀使用,可以直接:make_pizza(12, 'pep')
(注:函数很多时最好不要这样用,记不住呀,后缀起码还有提示)像头文件一样, import一般放在开头
1 | # 调用模块 |
1 | # 引入的函数( making_pizza ) |
1 | """栗4""" |
2. 类
小知识:
一般大写字母为类,小写为方法和变量
类中的函数称为方法,其调用与之前不同,如下例:
__init__()
是一个特殊的方法,在根据类创建实例时,会自动运行(其他方法在调用后才会运行),而且,两边的下划线一定不能少
这是一种约定,如果少了,那函数是不会自动调用的不难发现,每个方法 ()中都有变量
self
,以该变量为前缀的变量可以在类中任意位置调用(即使不在同一函数中)可以通过实例(
restaurant_1
)访问的变量(self.name
)称为属性,属性可以修改(详见下面的例子 num)‘类’是可以继承的(我们亲切的称为’父、子类‘),在父类的基础上,子类有自己的方法和属性,使用如下:
class hotel(Restaurant): 。。。
此处创建了一个子类 hotel,显然,子类就是在类的基础上多了 (父类),新的方法添加与类相同,注意,创建子类时,父类一定要在,且先有’父‘后有’子‘,父类应在子类之前,既然继承了父类,那么父类里的方法在子类中肯定是可以调用的:1
2def __init__(self, restaurant_name, cuisine_type):
supper().__init__(restaurant_name, cuisine_type)特有属性(需要自动运行的)
对的,就是用特殊函数supper()
,注意,不需要self
,因为父类也称超类
如果没有特殊属性,那这就是不需要的,父类方法子类可以直接用
如果父类中的某一方法在子类中是矛盾的,那就因该在子类中重写父类的方法,即命名相同的函数名,这样在运行子类时会忽略父类中与子类相同名的方法,但并未改变父类 ———— 称为多态
如果一个类中信息太多,可以将一部分提出来放到另一个类中,并将另一个类作为类中的属性(类中类),例如:
self.battery = Battery()
,类 Battery 就是个例子,不展开
在调用时,应是 “实例.
battery
.方法(Battery()中的)”
与函数一样,类也是可以调用的,方法一样(可以同时调用多个类,用逗号分开),详见”学习 (模块)“
灵活使用是关键
介绍几个函数:
访问器、修改器:getter、setter 详见练习.4
_slots_ =
: 限制类的绑定属性如:
__slots__ = ('_name', '_age', '_gender')
则在该类的对象属性只有三个,强调:只是该类对象有效,其它包括子类均无效
并不是所有方法都是对象方法,也有类方法,即与对象无关的方法 详见练习.5
类方法:在类中定义类方法,不能直接对类赋值可以通过类方法创建对象详见 练习.6
类之间的关系有三种:
一.is-a 关系也叫继承或泛化,比如学生和人的关系、手机和电子产品的关系都属于继承关系
二.has-a 关系通常称之为关联,比如部门和员工的关系,汽车和引擎的关系都属于关联关系;
关联关系如果是整体和部分的关联,那么我们称之为聚合关系;
如果整体进一步负责了部分的生命周期(整体和部分是不可分割的,同时同在也同时消亡),那么这种就是最强的关联关系,我们称之为合成关系
三.use-a 关系通常称之为依赖,比如司机有一个驾驶的行为(方法),其中(的参数)使用到了汽车,那么司机和汽车的关系就是依赖关系
有时,创建的类只作为父类(称为”抽象类”),这是需要借助
abc
模块 详见练习.7
演示
1 | # 创建父类并演示 |
3. 文件
前提:
Python 在读取文件时将所有文本解读为字符串,如果数字的话,使用时应用 int()转换
对文件进行任何操作的前提是打开文件,利用函数
open(文件名)
,但打开的文件应与当前文件在同一个目录中(下例目录为:学习)with
的使用:由 Python判断,在不使用文件时将文件关闭也可以用finally
代码配合.close
关闭文件,其中finally
代码为总是执行代码
访问的文件不一定在同一个目录中,这时就应注意文件路径
路径
相对路径:需打开的文件在当前文件目录的子目录中(以 text_file为例)
with open('text_file/读取.txt') as file_object:。。。
绝对路径:需打开的文件不在当前目录中(以 other_files为例)
file = 'C:/用户/hw/other_files/读取.txt'
## 路径太长,以一个变量代替with open(file) as file_object:。。。
!! 注:如果用’\‘一定要进行转义(‘\\‘),否则出现 \n之类的会被解读为换行
函数解释:
.read()
:读取文件里的全部内容,并将其作为一个字符串返回.readline()
:读取文件里的一行.readlines()
:一行行的读取文件内容,并将其存储在一列表中replace('。。1', '。。2')
:将字符串中的特定单词替换(字符串2 替换 字符串1)写入文件的格式有一些不同:
with open('文件名', 'w') as file_object:。。。
其实后面都有实参,再没有指定的情况下会默认为是读取模式,即:
'r'
附:
'w'
:写入模式'r'
:读取模式'r+'
:读写模式 ## 可读(read()) 可写(write())'a'
:附加模式
注:'a'
:此模式下,是给文件添加内容,而不会覆盖原先的内容,如果指定的文件不存在,会自动创建一个空文件'b'
:二进制模式
注:似乎可以两个一起用 ## 详见实例.2读取文件时可用
encoding=''
来指定编码,没有指定则以系统默认编码读取
演示
1 | # open()返回的是文件里的对象,将其赋给 file_object待用 |
4. 异常
前提:
写的程序出现错误是经常有的,这是’异常’,当然的有对策
使用
try-except
提高程序容错率,不是出现那鲜红的提示(有好的提示),一般把可能出现错误的代码放在try
中,若try
中代码成功执行,则会忽略except
代码,执行else
代码;
如果出现异常,执行的是except
代码,且后面还有代码,则程序仍会继续执行
静默失败:即在except
中的代码是pass
函数介绍
.split()
:以空格为分隔符将字符串拆分并存储在一个列表中 ## 再配合len(。。。)
可得知有多少单词
注:直接用len(。。。)
得到的是字符串的长度.count(。。。)
:确定字符串/列表中特定的单词(也有误差,the 在 then里)出现了几次 ## 大小写严格区分存储数据 ## 详见练习.9、练习.10
在程序中,需要用户输入数据,且在程序结束时希望数据保留下来以便下次直接使用,那数据必须存储起来,常用 JSON 格式存储,注意该格式文件后缀为.json
json.dump(。。。)
:接受两个实参,第一个为存储内容,第二个为文件对象json.load(。。。)
:接受一个实参,为文件对象注:在存储的数据仅为字符串时可以直接用
write()
,但为列表、字典时只能用 json
附:
json.dumps()
:将 Python对象处理为 JSON 中的字符串格式
json.loads()
:类似
- 重构:将代码化为作用单一的代码块(起码目前我是不会这么做的,没事找事)
演示
1 | # 除零错误 (ZeroDivisionError) |
5. 测试
在开发项目中(有点远。。。)对代码进行测试是必不可少的测试需引用模块
unittest
,为测试函数需创建一个继承unittest.TestCase
的类,在类中编写方进行测试 ## 详见下例在子类中以 test_ 开头的方法将自动运行(与一般的类不同,需区分)
断言方法:
unittest
模块中(常用)assertEqual(a, b)
: 核实 a == bassertNotEqual(a, b)
: 核实 a != bassertTure(x)
: 核实 x为 TureassertFalse(x)
: 核实 x为 FalseassertIn(item, list)
: 核实 item在 list中assertNotIn(item, list)
: 核实 item不在 list中方法
setUp()
:在类中先运行 ## 详见练习.11
注:类中不同方法所拥有的共同代码写入setUp()
中可简化代码if __name__ == '__main__'
在写的代码中有def main()
: 时,其下应有main()
,若是直接执行当前文件,则正常执行,若是该文件被调用,则不会执行,而在测试代码中也是一样的,不过是unittest.main()
演示
1 | import unittest |
3. 数据可视化
前提
需下载 python包 matplotlib,plotly
!!!默认是不能加中文标签的,以下两行使得中文标签可用
1 | from pylab import * |
还需注意代码使用位置,应在使用中文前,表格布置后(样式之类的)
基础绘图
折线图
1 | # 导入模块 pyplot并命名为 plt |
散点图
1 | # 详细解说见折线图 |
条形图
1 | from random import randint |
掷骰子实例
形成交互式界面
1 | from plotly.graph_objs import Bar, Layout |
调用的函数(die)
1 | from random import randint |