什么?你连基本的Python相关知识都不会?
顺序、判断、循环
变量类型
- int、float、str、bool
- list(列表)[1, 2, 3]
- tuple(元组)(1, 2, 3)
- set(集合){1, 2, 3}
- dict(字典){1: “python”, “acwing”: 2, 3: 4.0}
输入
使用input()函数,input()函数可读入一行内容,返回类型为str。一般配合split()、map()函数使用。
- a = (int)(input()) b = (int)(input()):读入两个整数,一个整数一行。
- a, b = map(int, input().split()):读入两个空格隔开的整数。
- split()会将一行字符串以空格作为分割符分开,返回一个字符串列表。map(func, var)会将func作用于var里的每个元素,返回作用后的var。
- a = list(map(int, input().split()))):读入一行数存到列表a中
当不知道读入的行数时,使用下列代码
1
2
3from sys import stdin
for line in stdin.readlines():
print(line.strip()) # strip()是为了去掉行末的回车
输出
- print(val1, val2, ...,
end=''):输出多个内容默认用空格隔开,可自定义结尾字符
- round(x, 1):将x保留1位小数
- print("x = %.2f, y = %.3f" % (x, y)):同样也可以用格式化输出(%分割,后面多个参数的话要用括号括起来)
- 格式化输出想输出%的话,写%%
- print(val1, val2, ...,
end=''):输出多个内容默认用空格隔开,可自定义结尾字符
if/while/for里的变量,在语句外可以访问
例如
1
2
3
4
5
6if a > b:
max_value = a
else:
max_value = b
print(max_value)
条件表达式
- and、or、not:与或非
- max_value = a if a > b else b:三目运算符,max_value=a仅当a>b时成立,否则=b
运算
- a, b = b, a:交换两个数
- python支持链式运算,例如if a >= b >= c: ...
for循环
- for c in "abc":依次输出每个字符
- for i in range(r):输出0, 1, ..., r - 1
- for i in range(l, r):输出l, l + 1, ... , r - 1
- for i in range(l, r + 1, 2):在[l, r]范围内,输出l, l + 2, l + 4, ...
列表
- 初始化
- 用循环 + append初始化
- 直接初始化
- a = [0 for i in range(3 + 1)]:a此时为[0, 0, 0, 0]
- a = [i * i for i in range(3 + 1)]:a此时为[0, 1, 4, 9]
- 切片
- a[l:r]:返回a[l], a[l+1], ..., a[r-1](l、r可缺省)
- a[1:]:返回a[1], a[2], ... a[len(a) - 1]
- a[1:3] = [2, 3]:等价于a[1]=2, a[2]=3
- a[1:3] = [0]:等价于a[1]=0,把a[2]删掉
- a[1:3] = []:等价于把a[1]、a[2]删掉
- 复制
- 不能用等号复制,用等号复制的话相当于新列表只是原列表的一个别名。修改新列表仍会对原列表产生影响。
- 用切片复制即可,即b = a[:]
- 列表的运算
- 列表的加法可以将两个列表拼接起来,得到一个新列表。
- 列表乘以一个整数,可以将若干个自身拼接起来,得到一个新列表。
- 将列表中的每个元素加上一个1
- a = [x + 1 for x in a]
- 列表常用函数
- len(a):返回列表长度
- a.append(x):尾部插入x
- a.insert(pos, x):在pos处插入x
- a.pop():删除尾部最后一个元素
- a.pop(pos):删除下标为pos处的元素
- a.reverse():翻转
- a.sort():排序
- a.sort(key=lambda x: (x[1], x[0])):a是一个列表,列表里的元素也是列表(里头有2个数),想先按照第二关键字排序,相等再按照第一关键字排序,就这样写。(默认是从小到大,从大到小可以加一个负号)
字符串
- ord(c):返回一个字符的ascii码
- chr(a):返回一个ascii码对应的字符
- 注意,虽然字符可以跟整数相互转化,但在Python中字符不能参与数值运算
- 使用""直接赋值,使用""" """可以赋值多行
- 字符串不能修改,切片也不像列表一样支持写操作
- 字符串支持加法、乘法、比较运算
- 常用函数
- len(s):返回字符串长度
- s.split(sep):返回一个字符串列表。如果给出了sep就按sep分隔;如果没给出,则会按空格分隔,但连续的空格会被视为单个分隔符,而且会忽略首尾的空白字符。
- s.strip():返回将首尾的空白字符删除后的结果
- s.replace(old, new):将s中所有的old子串都改成new
- s.find("abc"):查询某个子串在s中第一次出现的下标;如果不存在,则返回-1。
- s.lower():将所有大写字母变成小写。
- s.upper():将所有小写字母变成大写。
- s.join(a):a是一个字符串列表,这个函数返回将a中的字符用s作为分隔符拼接起来的结果。
- s.startswith(prefix):判断prefix是否为s的前缀。
- s.endswith(suffix):判断suffix是否为s的后缀。
元组
元组跟列表类似,只是不支持动态添加、删除元素,以及不能修改元素。其余用法类似。
元组需要用小括号括起来(也可以不加),中间的元素用逗号隔开。如果初始化只包含一个元素的元组,需要在该元素后添加逗号。
元组的解包
1
2
3
4
5
6
7
8
9t = 12345, 54321, "Hello!"
x, y, z = t # 将元组t解包,将元组内的三个值按顺序赋值给x、y、z
a, b = b, a # 这句话本质也是元组解包,就是将元组(b, a)解包,分别赋值给a, b
def cal(x, y):
return x + y, x * y # 函数的返回值本质也是元组的解包
a, b = cal(a, b)
集合
创建集合用花括号或set()函数。创建空集合只能用set(),不能用{},因为{}创建的是空字典。
初始化
1
2
3
4
5
6
7basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} # 会自动去除重复元素
print(basket) # 重复的元素已经去除了
a = [1, 2, 1, 3, 1]
b = set(a) # 将列表转化成集合,一般是为了去重。
c = list(b) # 将集合转化回列表
print(b, c)常用函数
- len(a):返回集合中的元素数量
- a.add(x):向集合中添加一个元素
- a.remove(x):删除集合中的x,如果集合中没x则报错
- a.discard(x):删除集合中的x,如果集合中x不存在也不会管
- x in a:判断x是否在a中
- x not in a:判断x是否不在a中
字典
创建字典用花括号或dict()函数。
初始化
1
2
3
4
5
6
7
8
9
10tel = {'jack': 4098, 'sape': 4139} # 创建一个字典
print(tel) # 输出 {'jack': 4098, 'sape': 4139}
a = dict() # 创建一个空字典
a[123] = "abc" # 在字典中插入一个key-value对
a[456] = "def" # 在字典中插入一个key-value对
print(a) # 输出 {123: 'abc', 456: 'def'}
b = list(a) # 将字典的关键字转化成列表
print(b) # 输出[123, 456]常用函数
- len(a):返回字典中键值对个数
- a[x]:获取关键字x对应的值,如果x不存在,会报异常
- a.get(x):获取关键字x对应的值,如果x不存在,不会报异常
- a.get(x, y):获取关键字x对应的值,如果x不存在,会返回默认值y
- del a[x]:删除关键字x对应的元素对
- x in a:字典中是否有x关键字
- x not in a:字典中是否没有x关键字
- a.keys():返回字典中所有关键字,以列表形式
- a.values():返回字典中所有值,以列表形式
- a.items():返回字典中所有键值对,以列表形式,每对键值对是一个元组
函数
- 函数内定义的变量为局部变量,只能在函数内部使用。当需要修改用全局变量时,需要用global关键字在函数内声明全局变量。
- 传参时,传数/str是值传递,列表是引用传递。
类
类中函数的第一个参数都是self,用来调用类本身的变量和函数。当调用类中函数的时候,第一个参数self不需要自己传递,Python会自动传递这个参数。
例子:
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
32class Hero:
hero_count = 0 # 类变量
def __init__(self, name, level=10): # 构造函数
self.name = name
self.level = level
print("Hero %s has been created." % name)
Hero.hero_count += 1
def __str__(self): # 定义str()函数的效果
return "Hero: %s" % self.name
def greet(self): # 问候
print("%s: Hi!" % self.name)
def move(self): # 移动
print("%s: Move!" % self.name)
def get_level(self): # 获取这个英雄的等级
return self.level
def next_level(self):
return self.get_level() + 1 # 调用类中的其他函数
zeus = Hero("Zeus")
athena = Hero("Athena", 6)
zeus.greet()
athena.move()
print(zeus.name, athena.get_level(), athena.next_level())
print(str(zeus), athena)
print(Hero.hero_count)每个类可以创建任意多实例。例如上面的Hero类,可以创建zeus和athena等实例。类变量由所有实例共享,一般通过类名访问,例如Hero.hero_count。实例变量与每个具体的实例绑定,一般通过具体实例来访问,例如zeus.name。
子类可以继承父类的变量和函数。self可以调用自身和父类中的变量和函数,如果子类和父类的变量或函数重名,优先使用子类的变量和函数。super()可以优先调用父类中的函数。
例子:
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
44
45
46
47
48
49
50
51
52class Hero:
hero_count = 0 # 类变量
def __init__(self, name, level=10): # 构造函数
self.name = name
self.level = level
print("Hero %s has been created." % name)
Hero.hero_count += 1
def __str__(self): # 定义str()函数的效果
return "Hero: %s" % self.name
def greet(self): # 问候
print("%s: Hi!" % self.name)
def move(self): # 移动
print("%s: Move!" % self.name)
def get_level(self): # 获取这个英雄的等级
return self.level
def next_level(self):
return self.get_level() + 1 # 调用类中的其他函数
class Zeus(Hero):
hero_name = "Zeus"
def __init__(self, level):
super().__init__(Zeus.hero_name, level) # 通过super()调用父类的构造函数
def greet(self):
print("%s: Hi!(from child class)" % self.name) # 使用的是父类的`name`
class Athena(Hero):
hero_name = "Athena"
def __init__(self, level):
super().__init__(Athena.hero_name, level) # 通过super()调用父类的构造函数
def greet(self):
print("%s: Hi!(from child class)" % self.name) # 使用的是父类的`name`
zeus = Zeus(6)
athena = Athena(8)
print(zeus.name, athena.level, Hero.hero_count)
print(str(zeus), str(athena))
zeus.greet()
athena.greet()
print(zeus.get_level())模块可以自定义,自己新建一个文件夹,里头可以写若干个.py文件,但是一定要有一个空的__init__.py文件,这样Python才知道这个文件夹是一个模块。导入函数可以写:from 文件夹名.文件名 import 函数名
包管理
- 使用conda进行包管理,以下命令使用Anaconda控制台打开
- conda env list:查看当前有哪些虚拟环境(*号是当前所处环境)
- conda activate 环境名:进入某个虚拟环境
- conda list:查看当前虚拟环境内安装了哪些包
- conda install 包名:在当前虚拟环境内安装一个包
- conda create -n xxx python=x.x:创建一个虚拟环境
- conda remove -n xxx --all:删除一个虚拟环境
- conda config --show channels:显示目前包含的源
- conda config --remove-key channels:恢复默认源
- 下列添加常用清华源
- conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2