Python3 语法基础
1.1 Python简介
- Python是1989年开始写的解释器
- python是一款动态的编程语言
1.2 Python简介
- 优点:
- 简单和明确,做一件事只有一种方法
- 学习曲线低,和其他很多语言相比,Python更容易上手
- 开放源代码,拥有强大的社区和生态圈
- 解释性语言,有跨平台
- 可扩展性和可嵌入性,可以调用C/C++代码,也可以在C++中调用python代码
- 缺点
- 执行效率低
- 在开发时可以选择的框架太多,有选择错误的地方就有错误
2.1 Python数据类型
- 整数型
- 浮点型
- 字符串
- 布尔型
- list(列表)
- tuple(元组)
- dict(字典)
- set(集合)
2.2 Python变量的定义输入和输出
1、变量名 = 数值
a = 10 # 这样定义了一个整形的数据类型,因为在python中声明变量不必要去指定数据类型,但是在使用的时候还是要去定
2、print("要输出的字符串或变量")
3、a = input("输入函数,这里是输入时的要提示的信息写这里")
4、格式化输出方式
a, b = 10, 80
print("a:%d, b=%d" % (a, b))
print(f"a:{a}, b={b}")
其实print()输出函数还有一个默认参数,它控制的是输出一段的末尾是什么默认是换行符\n
print(f"a:{a}, b={b}", end='\n')
3. Python分支结构
if 条件判断:
执行语句1
else:
执行语句2
if 条件判断1:
执行语句1
elif 条件判断2:
执行语句2
else:
执行语语句3
4. 循环结构
- 如果明确循环次数或对一个容器进行迭代(容器就是可以存储数据的变量,迭代就是遍历)使用for … in …
sum = 0
for x in range(1, 10): #range(1, 10)表示生成一个1-9的整数列表
x是将这个列表中的数据代入x中
sum += x
print(f"sum={sum}")
# 求1-100之间偶数和
for x in rang(1, 101):
if x%2 == 0:
sum += x
print(f"sum = {sum}")
- 如果不知道循环次数使用while()
while(循环终止条件):
循环体
# 求1-100
sum = 0
i = 0
while(i<=100):
sum += i
print(f"sum = {sum}")
5. break和contiune
break :终止循环
continue:跳过本次循环
6. 函数
函数定义
def 函数名(函数参数):
return 返回值
def add_data(a, b):
return a + b
c, d = 10, 20
e = add_data(c, d)
print(e)
# e的值是30
函数的类型
- 无参数函数
def add():
pass
- 有参数函数
def add(a, b):
return a + b
- 默认参数函数
一定要基础默认函数,没有默认值得形参一定要卸载前面
def add(a=0, b=0):
return a + b
sum = add() #默认参数函数就是说在调用的时候可以不写它的参数也可以调用成功
- 关键字函数
关键字函数就是说不确定参数个数,而具体多少个参数由调用者参数,比如上面的求和函数可以这样完善
def add(*args):
sum = 0
for val in args :
sum += val
return sum
he = add(1, 2, 3, 4, 5) #这样写程序不会报错
其实形参args是元组类型的,我们可以让函数返回值是args的值,可以调用type()方法看到是tuple()类型
再说另外一种功能一样的,但是它的类型是字典(dict)
def user_kwargs(**kwargs):
return kwargs
dict1 = user_kwargs(name='python', age=13)
print(dict1) # 这样输出的话会得到一个字典,所以说如果形参前面是两个*的话我们就可以很明确的明白其实就是创建了一个字典
- 关键字参数函数
其实很简单,就是一个函数有很多参数,可以按照顺序对形参赋值,也可以指定形参赋值
def add(a, b=0, c=0, e=0)
return a + b + c + e
#我们调用的话可以直接对c形参赋值
add(10, e=10) #指定形参的名字来赋值
7. 模块和包
-
什么是模块?
模块是一个Python文件,以.py后缀,包含了Python对象定义和Python语句。模块能定义函数,类变量,模块里也能包含可执行的代码
其实,对于我个人而言理解模块更像是用C++写代码使用别人写好的函数或类来提高自己的开发效率 -
如何使用模块?导入模块
- import 模块名
调用方法:模块名.功能名() - from 模块名 import 功能
from math import sqrt
print(sqrt(9))
- from 模块名 import *
from math import * # 这个意思是导入math这个python模块中所有函数,使用的时候直接使用函数名就可以
from math import *
print(sqrt(9))
- import 模块名 as 别名
import time as tt
tt.sleep(2)
print("hello, python")
- from 模块名 import 功能名 as 别名
from time import sleep as s1 #这句话的意思就是说导入time模块使用sleep()这个函数给他起个别名
s1(2)
print("hello, python!")
- 自定义模块
前面已经说了其实模块就是python文件,要想自己来制作模块的话,只要给你要制作的模块起一个名字
文件名:my_moule1.py
def testA(a, b):
print(a + b)
# 只在当前文件中调用该函数,其他导入的文件不执行
if __name__ == "__main__": #__name__代表的这当前的模块名
testA(1, 1)
想使用这个模块直接在另一个python文件中导入模块即可,另外我们写完的模块总需要测试看看是否正确
但是如果测试信息不删除,我们使用模块的时候他会自动执行我们写的测试代码,所以需要加一个判断
import as my_moule1
my_moule1.testA(10, 20)
- __all__作用
如果一个模块文件中有__all__变量,当使用from 模块名 import *这种方式代入的时候,只能使用__all__这个列表中的元素,也就是说__all__是列表类型,他控制着以from 模块名 import *这种方式导入模块可以使用的函数或变量 - 什么是包
包其实就是一堆python文件,作用就是方便管理 - 如何使用包
第一种方法:
import 包名.模块名
包名.模块名.目标
第二种方法:
在创建包的时候会自动生成一个__init__.py的文件
必须在__init__文件中添加__all__列表变量控制着能够使用的模块
from 包名 import *
模块名.目标
8. 类
- 类的创建
class 类名(object): #objectPython中的父类,所有类都继承它
pass
class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作,类似于C++中的构造函数
def __init(self, name, age, score):
self.name = name
self.age = age
self.score = score
print("哈哈")
def __str__(self):
print(f"姓名:{self.name}, 年龄:{self.age}成绩:{self.score})
def __del__(self): #__del__更像是C++中的析构函数
print("嘻嘻")
sudent = Student('小李', 20, 100) # 实例化对象
print(sudent)
#也可以在类外对类添加属性
sudent.str = 'hello' #但是这种方法添加的只是对sudent这个对象添加,如果在实例化一个对象,那么另一个对象是不具有str属性的
- 魔法方法
__init __(self) :初始化对象
__del __(self) :删除时对象调用
__str __(self) :输出对象信息,如果我们直接输出实例化对象的话,会输出对象的地址,只要在类中重新定义 __ str __(self) - 私有方法 私有属性
在定义的时候前面加两个_下划线即表明这是私有方法或私有属性
9. 继承
师傅会开锁,徒弟向它学习去了,学完之后徒弟不仅会师傅的开锁技术,并且自己也研究出了很多技术。子类继承父类,子类不仅包含着父类的属性和方法,子类也可以自己在定义属性和方法,但是对于父类中的私有属性或私有方法徒弟是继承不到的
class Student(object)
def __init(self, name, age, score):
self.name = name
self.age = age
self.score = score
print("哈哈")
def __str__(self):
print(f"姓名:{self.name}, 年龄:{self.age}成绩:{self.score})
def __del__(self):
print("嘻嘻")
class XM(Student):
def __init__(self):
print("小明")
xiaoming = XM()
xiaoming.name = '小明'
xiaoming.age = 20
#子类可以使用父类的所有方法和属性
注意点:
- 如果子类没有__init__()方法或__del__()方法Python会自动调用父类的初始化或析构方法
- 对于父类中的私有属性或方法子类是不能够继承过来的
子类调用父类同名方法或属性super() 方法使用
class A():
def __init__(self, nam, ag):
self.name = nam
self.age = ag
print('A 我是构造')
self.__ace = 11
def __del__(self):
print(" A我是析构")
def __printA(self):
print('helo')
def abc(self):
print("A 类")
class B(A):
def __init__(self):
self.b = 10
print('B 我是构造')
def print_b(self):
print("hello")
def abc(self):
print("B 类")
def abc_A(self):
super().abc() #默认调用父类方法
def __del__(self):
print("B 我是析构")
b = B()
b.print_b()
b.abc_A()
多继承
多继承就是说一个类继承了多个类
class A():
def print_A(self):
print("我是A")
def app(self):
return 10
class B():
def print_B(self):
print("我是B")
def app(self):
return 20
class C(A, B):
def print_C(self):
print("我是C")
def app(self):
return 30
def appA(self):
return A.app(self)
def appB(self):
return B.app(self)
从上面代码中看到C类继承了A,B这两个类,C类可是使用A和B两个类的属性和方法,在C类中又写了app()函数这叫函数重写,如果在C类中重写了A类或B类中的属性这叫重定义
如果在C类中想访问B类的app()方法或A类的app()方法可以看到 类名.属性名(self)
的方式去访问。
注意:如果说使用super()方式访问的话,他会自动的访问C类括号中第一个继承的类去访问C(A, B)也就是说他会首先访问A类的app()方法
10. 多态
通过函数重写,让父类的同一个方法在子类中有不同的实现,然后通过子类调用同名的方法就会有不同的行为,这就是多态
多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同结果
实现步骤:
- 定义父类,提供公共方法
- 定义子类,重写父类方法
- 编写函数,传输不同的子类实参,可以看到不同的实行效果
class A():
def __init__(self, a, b):
self.a = a
self.b = b
def app(self):
return self.a + self.b
class B(A):
def __init__(self, a, b):
self.a = a
self.b = b
def app(self):
return self.a - self.b
class C(A):
def __init__(self, a, b):
self.a = a
self.b = b
def app(self):
return self.a * self.b
def stage(a):
print(a.app())
b = B(10, 5)
c = C(10, 5)
stage(b)
stage(c)
# 通过传输不同的子类形参,可以看到相同的代码会有不同的执行结果
11. 文件
- 文件的打开
文件打开的几种方式
f = open('test.txt') #模式是r方式打开
f.close() # 关闭文件
-
读取文件
data = f.read()
data = f.read(读取长度字节)
data = f.readlines() 按照行的方式全部读入,返回列表
data = f.readline() 一次读入一行 -
写文件
f.write(‘内容’) -
文件的移动
f.seek(偏移量, 起始位置默认0)
0 起始位置
1 当前位置
2 结尾位置
12. 异常
-
什么是异常
异常就是写代码中出现错误的提示
-
如何使用异常
try:
可能出错的代码 #这里抛出异常
except 异常接受的类型:
如果出现异常执行的代码 #这里接受异常,并且异常的处理方式
try:
f = open("text.txt", 'r') #以r方式打开文件,但是文件不存在,抛出异常(错误)
except: # 接受异常,以w方式打开文件
f = open("text.txt", "w")
finally: # 不管有没有异常,都要执行的代码
f.close()
else: # else 表示不管有没有异常都要执行的代码
print("没有异常")
- 捕获所有异常 Exception是所有异常的父类
try:
print(num)
except Exception as result:
print(resulit)
- 异常类型的自定
在Python中,抛出⾃自定义异常的语法为 raise 异常类对象
# 自定义异常,继承Exception
class ShortInputError(Exception):
def __init__(self, lenght, min_len):
self.length = lenght
self.min_len = min_len
#设置抛出异常的描述
def __str__(self):
return f"您输入的长度是{self.length}, 不能少于{self.min_len}"
def main():
try:
con = input("输入密码")
if(len(con) < 3):
raise ShortInputError(len(con), 3)
except Excption as result:
print(result)
else:
print("密码输入完成")
13. 数据类型和其他类型的常用方法
-
字符串常用方法
len(字符串类型) 获取字符串长度
str.capitalize():作用:字符串首字母转换大写,返回新的字符串
str.upper():获取字符串转换大写的拷贝,返回新的字符串
str.fin(‘or’):查找字符串所在下标(位置),返回要查找的下标,如果查找不到返回-1
str.index(‘or’):查找字符串所在下边,但是如果差找不到会引发异常
str.startswith(‘He’):检查字符串是否以指定的字符开头,返回布尔类型
str.endswith(‘ld!’):检查字符串是否以指定的字符结尾,返回布尔类型
str.center(50, ‘’):将字符串指定的宽度居中并在两侧填充参数二这里是 * 返回新的字符串
str.rjust(50, '’):将字符串以指定宽度靠右侧放置,左侧填充指定字符
str.isdigit():检测字符串是否是数字字符串 返回布尔类型
str.isalpha():检测字符串是否都是以字母组成, 返回布尔类型
str.isalnum():检测字符串是否以字符和数字构成,返回布尔类型
str.strip():删除字符串两边空格部分,并返回新的字符串 -
字符串切片
str[起始位置:结束为止:步长]
str[::-1] 字符串倒置 -
公共方法
len() :计算容器元素个数
del 或 del():删除
max():获取容器最大值
min():获取容器最小值
range(start, end, step):生成start到end的数字、步长为step,供for循环使用
enumerate(容器对象,开始下标):用于将一个可遍历的数据对象组成为一个索引序列元组,同时列出数据和数据下标,一般在for中使用
type():返回对象的类型 -
列表常用方法
list1 = [‘hello’] * 5:返回一个长度为5的每个元素为hello的列表
len(list):返回列表长度
list.append(数据):添加元素
list.insert(位置,数据):指定位置添加指定数据
list.pop(i):删除指定位置元素,默认尾删除
list.remove(数据):删除指定元素
list.clear():清空列表元素
list1 += [100, 200] :合并列表 -
字典
dict.get():获取key是否存在,默认返回None,可设置默认值
dict.pop(‘key’):删除指定key-value
dict[‘key’]= value :可直接添加键和值
14. 推导式
用一个表达式创建一个有规律的列
- 列表推导式
如果想要生成一个1-100的列表可以用循环
list1 = []
for i in range(1, 101)
list1.append(i)
可以用一行代码来实现
list1 = [i for i in range(1, 101)]
带有if判断的推导式
list1 = [i for i in rang(1, 101) if i % 2 ==0]
- 字典推导式
将两个列表合并为一个字典(前提是列表长度必须相同)
list1 = ['name', 'age', 'gender']
list2 = ['小明', 20, 'man']
dict1 = {list1[i]:list2[i] for i in range(len(list1)) }
快速提取字典中目标数据
提取字典中符合要求的
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
con = {key:value for key, value in counts.items() if value >= 200}
15. Python中的数据类型做函数参数
在学习C语言的函数时,大部分都是通过指针做函数参数来修改实参的值,那么python中需要注意的是Python可以通过函数修改的数据类型是列表、字典、集合