0.前言
最近加入了一个新的团队,对python有一定的要求,因此用一周左右的时间学习了python的基础语法。
1.用pycharm编写程序
1.0. 项目名字:PythonStudy
对应视频:4.用Pycharm编写程序
1.1. 修改模板注释
注意,①必须要加,这样python在输出(print)时,中文就不会出现乱码
1.2. 开始写第一个python项目
1.2.1. 新建python项目
1.2.2. 新建python程序
1.2.3. HelloWorld
print("hello,world")
随后右键,点击Run运行
1.3. 注释
1.3.1. 单行注释
#注释内容(相当于java的 //注释内容)
1.3.2. 多行注释
"""
多行注释:第一行
多行注释:第二行
"""
注意:可以用单引号,也可以用双引号,
但使用双引号会更加规范!
1.4. 变量
1) 变量可以是任意类型
2) 变量名必须是==大小写英文、数字和下划线( _ )==的组合,不能以数字开头
1.4.1. 赋值
直接 变量名 = 变量值
如果类型是字符串,值用单引号或双引号括起来
1.4.2. 带变量的输出
1.4.2.1. 拼接变量
在java语言中,有
int age = 10;
System.out.println("我的年龄是" + age + "岁");
在python语言中,有
age = 10
print("我的年龄是", age, "岁")
补充:用加号其实也可以,但必须类型相同!
区别就是:使用逗号有空格,使用加号则没有空格
特别注意:如果类型不同,使用加号会报错
1.4.2.2. 格式化输出(占位符 %d 和 %s )
1) %d : 有符号的十进制整数
2) %s : String字符串
在需要用到变量的地方使用占位符,
然后在整个字符串的最后面加上%(变量1 , 变量2 , 变量3…)
1.5. 拓展知识点:print方法还可以写其他内容
1.5.1. 分隔
直接用逗号,可以用空格将字符串分隔
如果在最后用sep = “.” 就会以点分隔字符串
(注意,在sep前面的逗号,不是分隔,类似在java中,多个属性用逗号分隔)
1.5.2. 换行设置
在后面可以加上end = “xxx”,来设置这个print函数结尾的内容
可以看到,只有在默认情况,或是end="\n",才会换行
否则不会换行,并拼接end里的内容
2. input() , type() , 强制类型转换
2.0. 项目名字:PythonStudy
对应视频:5.条件判断语句
2.1. input方法
input("提示语")
如上,在运行后,会在控制台输出"提示语"
input方法会接收用户输入的内容,同时也可以赋值(类型是String)
结合print( )方法,有如下用法:
如果有多个input,python会逐个运行(运行到input,类似于遇到一个断点)
2.2. type方法
使用type( )可以判断输入参数的类型
2.3. 强制类型转换
和java类似,可以用int( ),str( )等进行强制类型转换
3.条件判断语句
3.0. 项目名字:PythonStudy
对应视频:5.条件判断语句
3.1. 条件判断语句
特别注意:Python指定任何非0和非空值为true,0或None为false
基本形式为:
if 判断条件1:
执行语句1
elif 判断条件2:
执行语句2
else:
执行语句3
python的语法特别注重缩进,同一层次的缩进要相同(一般为4个空格,也就是按一次tab)。其实缩进量可多也可少,只要保证相同即可。
3.2. 导入import
直接import 包名即可
建议写在有效代码的第一行
4.循环语句
4.0. 项目名字:PythonStudy
对应视频:6.循环语句
4.1. for循环
for循环分为两种,一种是生成变量 i 遍历,另一种是直接对字符串或列表遍历
4.1.1. 第一种
4.1.1.1. 一个参数
python:
for i in range(5):
...
java:
for(int i = 0; i < 5; i++){
...
}
4.1.1.2. 两个参数
python:
for i in range(1, 5):
...
java:
for(int i = 1; i < 5; i++){
...
}
4.1.1.3. 三个参数(很少用)
python:
for i in range(1, 10, 3):
...
java:
for(int i = 1; i < 10; i+=3){
...
}
4.1.2. 第二种
4.1.2.1. 遍历字符串
for i in "guangzhou":
...
如上,把字符串的每一个字符依次赋给 i
4.1.2.2. 遍历列表
for i in ["妮妮", "佳佳"]:
...
补充知识:列表的定义方法为:
dataList = ["妮妮", "佳佳"]
取出列表的某个值:
a = dataList[0] #妮妮
在for循环中取值的话:
for i in dataList:
print(i)
如上,直接取i就可以了!
4.2. while循环
4.2.1. 基础while循环
基本格式如下
while 条件语句:
...
特别注意:在python中没有i++的用法,只能是i+=1
而且要用到的变量必须在循环之前被定义好
4.2.2. while-else循环
其实就是不满足while的时候,就会执行else,并终止循环!
以下例作为测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvAPNwR3-1620282086879)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210426102911684.png)]
可以看到,由于dataList[0]是"妮妮",不满足while执行条件
就直接执行了else
并且可以发现,程序不再继续执行
即一旦不满足while条件,执行了else,循环就停止了
4.3.enumerate() - 转换成枚举类型
enumerate(dataList)
enumerate()能将列表、元组、字典变成枚举类型
此时里面的每个元素,都会被转化成==(index, value)==格式的二元组
4.4. break和continue
4.4.1. break:
和java一样,执行break后,结束并跳出整个for循环/while循环
4.4.2. continue:
和java一样,执行continue后,跳出本次循环
5.字符串
5.0. 项目名字:PythonStudy
对应视频:7.字符串
5.1. String字符串
1) 使用单引号、双引号、三引号(三个单引号/三个双引号,常用于段落)括起
2) 使用反斜杠表示转义
\t:制表符
\n:换行符
3) 默认用utf - 8编码,所有字符串都是unicode字符串
5.2. 截取字符串
需要注意:java和python在截取字符串时,都是左闭右开
5.2.1. 基础方式
str1[0: 4]
5.2.2. 截取某索引字符之前 / 之后
# 截取5之前
str1[:5] # 左闭右开:不包括5
# 截取5之后
str1[5:] # 左闭右开:包括5
5.2.3. 截取字符串—自定义步进值
str1[0:5:2] #从索引值0-4的字符中,以步进值为2,进行截取
5.3. String类的方法
方法 | 作用 |
decode(“utf-8”,”strict”) | |
encode(“utf-8”,”strict”) | |
isalpha() | 判断是否所有字符都是字母 |
isdigit() | 判断是否所有字符都是数字 |
isnumeric() | 判断是否所有字符都是数字(有细微区别,日后再说) |
isalnum() | 判断是否所有字符都是字母或数字 |
join(seq) | 以seq作为分隔符,将str所有元素合并 |
len(str) | 返回长度 |
lstrip() | 截掉字符串左边的空格 |
rstrip() | 截掉字符串右边的空格 |
split(参数…) | 以其中一个参数作为分隔符分割字符串。日后再说 |
6.列表
6.0. 项目名字:PythonStudy
对应视频:8. 列表(上)、9. 列表(下)
6.1. 列表定义
dataList = ["妮妮","佳佳",3] #类型不要求相同
list可以存储混合类型,存储时不会改变数据类型
附:列表切片代码如下:
dataList[0: 3: 2] # 索引范围0-3,每隔两位切一个
6.2. 列表 - 新增
6.2.1. append - 增加
dataList.append( 6 ) #新增数据 6
补充:可以看到这里新增的数据是String类型
这是因为:通过input输入的类型都是String类型
append新增的元素为列表时,这个元素列表会原样加入其中
dataList.append( [3, 4] ) #新增3、4两个元素
6.2.2. extend - 扩展
dataList.extend( [3, 4] ) #扩展列表,元素是[3, 4]
如果extend的列表,其中的元素仍是列表
那么这个列表元素不会被拆开
6.2.3. insert - 插入
dataList.insert(1, 8)
需要注意,如果insert的元素是列表,那么这个列表会被原样加入
6.2.4. 小结
python对列表元素的默认处理方式,是直接将其作为元素执行
只有extend才会将新增的列表元素拆开并逐个添加
6.3. 列表 - 删除
6.3.1. del - 根据下标删除
del dataList[1]
6.3.2. remove - 根据数值删除
dataList.remove("妮妮")
特别注意:如果有相同的数据,只会删除第一个
6.3.3. pop - 弹出
data1 = dataList.pop( ) #弹出最后一个
data2 = dataList.pop(1) #弹出下标为1的数据
6.4. 修改
修改直接用下标
dataList[1] = "老王"
6.5. 查找
6.5.1.查找列表中是否有某元素
if "佳佳" in dataList:
...
6.5.2.查找某元素的下标
list下有index方法,用index(“xxx”)可返回该元素的下标,如
dataList.index("妮妮")
还可以在范围内查找:
dataList.index("妮妮", 1, 4) #在 1-4 索引范围内查找妮妮
特别注意:还是左闭右开原则
如果没有找到,程序会报错,此时需要进行异常处理。
6.5.3.查询某元素在列表中有几个
dataList.count("妮妮") #看列表中有几个"妮妮"
6.6. 对列表元素处理
6.6.1.reverse - 反转
dataList.reverse() #将dataList的所有元素位置反转
需要注意,reverse()的返回值是void,因此不可用print(dataList.reverse)
reverse方法直接对原列表dataList操作,这点与java不太一样。
6.6.2.sort - 排序
dataList.sort() # 升序排序
dataList.sort(reverse=True) # 降序排序
6.7. 列表嵌套
7.元组
7.0. 项目名字:PythonStudy
对应视频:10.元组_字典(上)
7.1.元组Tuple概述
元组(Tuple)与list类似,不同之处在于:
1) tuple的元素在定义后不可更改
2) tuple写在小括号里
tuple的元素不可变,指的是地址不可变。如果tuple其中一个元素是一个列表,那么这个列表不可变,但列表中的数据可变。
7.2.定义元组
tuple1 = () # 定义一个空元组
tuple2 = (1,) # 定义只有一个数据的元组
tuple3 = (1, 2, 3) # 定义多个数据的元组
▲ 特别注意:定义只有一个数据的元组时,后面要加逗号
附:元组切片代码如下:
tuple4[0: 5: 2] # 索引范围0-5,每隔2位取一个
7.3.增加(联合)
不可增加元素,只能生成新的元组,并将两个元组联合
tuple1 = (1, 2)
tuple2 = (3, 4)
newTuple = tuple1 + tuple2 # (1, 2, 3, 4)
7.4.删除
不能删除数据,只能删除整个元组
del tuple1
8.字典
8.0.项目名字:PythonStudy
对应视频:10.元组_字典(上)、11.元组_字典(下)
8.1.定义
字典(dict)其实就是java中的map,存储格式都是键值对
dict1 = { "name": "妮妮",
"sex": False}
如上,键值之间用冒号,键值对用逗号分隔
书写方式与JSON字符串类似
8.2.访问
8.2.1.直接访问
dict1["name"] # 直接访问,参数是key
如果不存在这样的键值对,则会报错
8.2.2.get方法访问
dict1.get("location") #不存在时,返回None
dict1.get("location", "不存在这样的键值对") #第二个参数设定不存在时的返回值
8.3.新增
dict1["location"] = "广州" #新增键值对 location : 广州
8.4.删除
8.4.1.del - 删除
del dict1 # 删除这个字典
del dict1["sex"] # 删除key为sex的键值对
8.4.2.clear - 清空
清空意思是删掉字典中所有的键值对,但保留这个字典
dict1.clear()
8.5.修改
dict1["name"] = "佳佳" # 把key为name的键值对的值改为"佳佳"
和增加的代码类似
8.6.查询(遍历)
8.6.1.遍历所有的key
dict1.keys() # 返回值是一个列表list
遍历dataMap.keys(),原理和遍历列表list一样
8.6.2.遍历所有的value
dict1.values() # 返回值是一个list
遍历dict1.values(),原理和遍历列表list一样
8.6.3.遍历所有键值对item
dict1.items() # 返回值是一个list,每个元素都是一个元组tuple
8.6.3.1.第一种方式:用item接收遍历的结果
for item in dict1.items():
print("%s...%s..." % item) # 一定要用两个占位符%s
▲ 特别注意:遍历dict1.items()时
得到的每个item(键值对)都是固定有两个元素的元组tuple(“key” ,“value”)
此时如果只用一个%s占位符输出,就会报错
因为python会根据元组的元素个数,将其逐个分配给每个占位符(也就是说会被分配给两个占位符)
8.6.3.2.第二种方式:分别用key和value接收遍历的结果
for key, value in dict1.items():
print("%s...%s..." % (key, value)) # 一定要用两个占位符
9.集合
9.0.项目名字:PythonStudy
对应视频:11.字典(下)_集合
9.1.定义
集合(set)的特点:
1) 会过滤重复元素
2) 无序(没有索引)
set1 = {1, 2, 3, 3} # 用{ }定义,会自动去重
因此,集合常用于去重:将list、tuple等转换成set,再转换回来
9.2.数据类型转换
其实之前学过的所有数据类型,几乎都是可以相互转化的
以转化成set为例
其中字典转换成集合,只会存储key而不会存储value
9.3.增加
9.3.1.add - 新增
set1.add()
9.3.2.update - 更新
set1.update(set2) #将set2的元素并入set1
类似list的extend,是将set2所有元素并入set1
9.4.删除
9.4.1.del - 删除集合
del set1
9.4.2.clear - 清除所有元素
set1.clear()
9.4.3.remove - 移除元素:参数是元素的值
set1.remove("a") # 删除值为a的元素
9.4.4.pop - 弹出元素
set1.pop() # 空参,弹出最后一个元素
由于集合set是无序的,因此不可以像列表一样弹出某个索引的元素
10.函数
10.0.项目名字:PythonStudy
对应视频:12.函数
10.1.定义
函数其实就是java的方法:
def hello_world():
...
规范:
1) 蛇形命名法aaa_bbb_ccc
2) 方法前后需要各空出两行
10.2.带参函数
def print_me(str1)
和java类似,括号内写上形参即可,但不需要写数据类型
10.3.返回值
10.3.1.一个返回值
def add(a, b):
return a + b
和java类似,return即可
10.3.2.多个返回值
def divide(a, b):
shang = a // b # 用/时商是小数;用//时商是整数
yushu = a % b
return shang, yushu
返回值之间用逗号分隔。常见的返回值接收方式有两种:
1) 用占位符接收
2) 用变量接收
10.4.局部变量与全局变量
与java的规则相同,简单复习一下:
1) 局部变量只在方法体内可调用
2) 全局变量在整个py文件中都可调用
3) 局部变量和全局变量相同时,优先调用局部变量
4) 局部变量和全局变量相同时,用global调用全局变量:
global a # 不用global的话,就只是定义一个同名的局部变量
# 在方法中使用global后,方法体中所有的操作都是对全局变量的操作
11.文件操作
11.0.项目名字:PythonStudy
对应视频:13.文件操作
11.1.open - 打开文件
使用open函数可以打开一个已经存在的文件
若不存在,则新建一个这样的文件
默认路径:该程序所在的文件夹
file = open("demo.txt", "w") # 以“写入”模式打开demo.txt
file.close() # 记得关闭文件,其他程序才可以正常打开该文件
11.2.访问模式
常用的访问模式有六种:
访问模式 | 解析 |
r | “只读”模式,文件的指针放在文件的开头,这是默认模式 |
w | “写入”模式,若文件已存在则覆盖,不存在则新建 |
a | “追加”模式,在末尾追加内容,不会覆盖 |
rb | “只读”模式,以字节的格式打开,文件的指针会放在文件的开头 |
wb | “写入”模式,以字节的格式打开,若文件已存在则覆盖,不存在则新建 |
ab | “追加”模式,以字节的格式打开,在末尾追加内容,不会覆盖 |
11.3.写入
在open时,如果是"w"打开(写入模式),会覆盖内容
如果是"a"打开(追加模式),会在文末添加内容。
file.write("hello world!!") # 写入hello world
11.4.读取
11.4.1.read - 读取指定字符
需要注意,使用了read函数后,指针就会移动
在下次使用read函数时,不会再从文件开头开始读取,而是从指针位置开始计数
content = file.read(2) # 读取2个字符,赋值给content
11.4.2.readline - 从指针位置读取本行剩余内容
line1 = file.readline() # 从指针位置开始读取,直到本行结束
常用情况是直接readline()读取一整行
但如果指针不是指在本行开头,那么readline()会读取剩下的内容,直到本行结束
11.4.3.readlines - 读取所有行
lines = file.readlines() # 读取所有行,返回值是一个列表
12.进阶文件操作——引入os模块
12.0.项目名字:PythonStudy
对应视频:13.文件操作
12.1.导入os
import os
默认操作目录,是.py文件所在目录
12.2.rename - 重命名
import os
os.rename("a", "b") # 把文件a命名为文件b
12.3.remove - 删除
import os
os.remove("a") # 删除文件a
12.4.mkdir - 创建文件夹
import os
os.mkdir("dirPath") # 创建文件夹dirPath
12.5.rmdir - 删除文件夹
import os
os.rmdir("dirPath") # 删除文件夹dirPath
12.6.getcwd - 获取当前操作目录
import os
os.getcwd() # 默认目录是.py文件所在目录
12.7.chdir - 改变当前操作目录
import os
os.chdir("../") # 改变操作目录,../表示上级目录
12.8.listdir - 获取指定目录下所有文件名
import os
os.listdir("dirPath") # 获取目录下所有文件名
os.listdir() # 空参时,获取当前操作目录下的所有文件名
13.异常处理
13.0.项目名字:pythonStudy
对应视频:14.异常处理
13.1.try - except捕获异常
try:
xxx # 异常代码
except Exception as result: # 捕获异常,将异常信息保存到result
print(result)
Exception细化下去,还有类似IOError等错误。
13.2.finally关键字
与java类似,无论如何finally中的内容都会被执行
由此引出以下例题:
13.3.错误典题
如下代码,希望实现:
在open文件后,利用finally关键字,无论如何都关闭文件
在没有异常时,可以正常执行:
但是如果在open时出现异常,会有如下情况: