python~基础篇
前言
原文博客地址:python~基础篇 | 旅程blog (cxy.red)
Python之禅 by Tim Peters
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
当存在多种可能,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
1.环境安装
python可以在所有主流的Windows系统上运行,python只占用很小的内存,只要不是很老旧的电脑都能运行python。
1.1 python的版本
- CPython:
这是Python软件基金会所创建的官方标准Python,是目前最流行的Python(Cpython是免费开源)。CPython是用C语言实现,添加了第三方内置组件pip,为它编写的二进制文件很难在其他Python上使用。 - ActivePython:
ActiveState公司发行的一套企业级二进制Python编程调试工具,带有IDE。ActivePython有三个发行版本:社区版、商业版和企业版,可用于任何操作系统,和其他Python兼容。 - Anaconda:
Python的主要用途就是数据分析和机器学习,Anaconda在这一方面的使用最广泛。Anaconda提供了自己用于管理的第三方库的安装程序,通过管理其二进制依赖关系,更轻松地将这些软件包保持在最新状态。同上ActivePython一样Anaconda也是提供开源社区版以及商业版。
1.2 python安装
因为Anacona里面预先装了更多的第三方库,所以用Anaconda来进行学习。
首先到Anaconda官网下载:https://www.anaconda.com/
选择适合自己的电脑版本进行安装,如果不会安装请参考:https://blog.csdn.net/in546/article/details/117400839
1.3 文本编辑器 (IDE)
一般的文本编辑器都能编辑python,但是不是每个文本编辑器都好用。
- Pycharm:Pycharm 是目前 Python 语言最好用的集成开发工具,缺点就是占用内存高,且Pycharm成本高昂,专业版会收取一定费用。Pycharm 官网
- Visual Studio Code:VS Code 是完整的代码编辑器,具备很多优秀功能,被许多程序员称其为最好的 IDE 编辑器,它很轻巧便捷,重要的是它免费开源。 VS Code官网
1.4 VS Code 配置使用
-
打开Visual Studio Code,使用快捷键“Ctrl+Shift+X”打开扩展选项卡,在输入框中输人“chinese”搜索插件,点击搜索到的第一个插件chinese的“install”按键,如果不需要中文版也可以不安装此插件。安装插件后重新进入,我们就发现VS Code变为了中文界面
-
安装Python插件,搜索出来的第一个就是我们所需要的,点击安装。安装完后我们就需要测试一下,编辑器是否能正常运行,我们点击左上角文件,点第一个新建一个test.py文件(.py后缀表示这是个python文件),然后在右边边输入:
print("hello world")
然后点击右上角三角形运行。然后我们会发现无法运行,如下图所示:
-
这是因为我们没有选择解释器,使用的是默认解释器,所以无法运行python文件,我们需要用Ctrl+Shift+P命令打开命令面板,然后输入Python: Select Interpreter选择一个python解释器。至此指定完解释器之后就可以在指定环境下运行python程序了。如下图所示:
1.5 VS Code报错解决
如果还是报错那么应该是环境变量的问题,我们可以设置环境变量:
- 进入设置,搜索环境变量
- 选择环境变量,点击编辑
- 找到我们安装的anaconda下的Scripts文件夹的路径
- 点击新建,把路径粘贴进去
- 找到anaconda下library\bin文件夹路径重复3、4步然后点击确认
至此环境变量的设置就完成了。
2.走进python
- python是解释型语言
- Python 是高级语言
- Python 是面向对象的编程语言
2.1 什么是解释型语言
程序运行是通过解释器对程序做出解释然后再执行,因为相比于编译型语言多了解释这一步骤,所以python的缺点之一就是慢,相比于c、c++这些编译性语言,性能可能相差上百倍。
2.2 什么是高级语言
相比于很难理解,且对人很不友好的机器语言(二进制语言)和汇编语言(符号语言),高级语言更接近于人的思考方式,更容易理解。高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法实现特定的功能。
2.3 什么是面向对象
随着计算机技术的不断发展,人们的需求不断提高。使得需要解决的问题越来越复杂,面向对象式的编程方式也逐渐发展起来,因为这种方式很接近于人类的思考方式,一切事物都可以用对象来表示,由于面向对象有封装、继承、多态性的特性,使代码更加灵活、更加易于修改维护
2.4 python能干什么
-
网站后台
python有很多成熟的web框架,例如:Django、Flask等。
-
网络爬虫
python很适合做网络爬虫,例如很知名的爬虫框架Scrapy就是python实现的。
-
科学计算
Python有NumPy,Pandas等科学计算库,能很方便地实现科学计算。
-
机器学习
目前很多流行的机器学习框架都是python机器学习框架,著名的阿尔法围棋程序就是用python编写的。
-
大数据
Python有很多第三方库适用于数据分析,所以使用Python处理大数据是很适合的。
-
系统运维
流行的Linux系统上都预装有Python,所以对运维人员来所掌握Python也是一个很有必要的技能
3.python基础
3.1 常用数据类型
- 整数(int) 例如:3
- 浮点数(float) 例如:3.0
- 字符串(str) 例如:“hello”或者“你好”
- 列表(list) 例如:[“hello”,"你好"]
- 元组(tuple) 例如:("hello","你好")
- 字典(dict) 例如:{"hello":你好}
- 布尔(bool) 例如:True或False
3.2 运算符
3.2.1 算数运算符
操作符 | 描述 | 示例 |
+ | 运算符两侧的值相加 | 1+2=3 |
- | 左操作数减去右操作数 | 3-2=1 |
* | 操作符两侧的值相乘 | 1*2=2 |
/ | 左操作数除以右操作数 | 3/2=1.5 |
% | 左操作数除以右操作数的余数 | 3%2=1 |
** | 幂次方运算 | 3**2=9 |
// | 整除 | 3//2=1 |
3.2.2 比较运算符
比较运算符是对符号两边的操作数进行比较,如果比较结果是正确的,那么返回布尔类型True,否则返回False。
操作符 | 描述 | 示例 |
** | 比较对象是否相等 | 1** 1 |
!= | 比较对象是否不相等 | 1!=2 |
> | 左操作数是否大于右操作数 | 2>1 |
< | 左操作数是否小于右操作数 | 1<2 |
>= | 左操作数是否大于等于右操作数 | 2>=1 |
<= | 左操作数是否小于等于右操作数 | 2<=1 |
3.2.3 赋值运算符
最常用的赋值运算符是=,表示把右操作数赋值给左操作数,这里要与比较运算符的==区分开
操作符 | 描述 | 示例 | 展开 |
= | 右值赋给左值 | a=1 | a=1 |
+= | 左值等于左值加右值 | a+=1 | a=a+1 |
-= | 左值等于左值减右值 | a-=1 | a=a-1 |
*= | 左值等于左值乘以右值 | a*=1 | a=a*1 |
/= | 左值等于左值除以右值 | a/=1 | a=a/1 |
%= | 左值等于左值除以右值的余数 | a%=1 | a=a%1 |
**= | 左值等于左值的右值次幂 | a**=1 | a=a**1 |
//= | 左值等于左值整除右值 | a//=1 | a=a//1 |
3.2.4 逻辑运算符
操作符 | 描述 | 示例 |
and | 当两个操作数都是真才返回真 | a and b |
or | 当两个操作数任一个为真就返回真 | a or b |
not | 反转逻辑状态,如果条件为True,则返回False | not a |
3.2.5 关键字
-
in :用于判断关键字是否在指定序列中
-
is :用于判断两个变量引用对象是不是同一个
3.3 数据结构
Python有六种内置序列,即列表、元组、字符串、Unicode字符串、buffer对象和 range 对象。序列通用的操作包括:索引、长度、组合(序列相加)、重复(乘法)、分片、检查成员、遍历、最小值和最大值。下面以最常用的序列,列表、元组、字符串作为演示。
3.3.1 序列通用操作
序列可以根据索引下标来获取元素的值。Python中索引是从"0"开始的,第一个是"0",第二个是"1"。也可以通过负数来索引,"-1"代表最后一个元素,"-2"代表倒数第二个元素。
序列可以进行切片操作,切片操作的实现需要两个索引为边界,第一个索引的元素含在切片内,第二个索引的元素不包含在切片内,类似数学区间的[a,b)。
同样地切片也支持负数操作,按照从右往左的顺序的索引获取切片。[:b]表示默认从"0"开始,[a:]表示从"a"开始到序列结束,[:]表示整个序列。
切片第三个参数可以设置步长,默认步长为1,[a🅱️2]表示步长为2,表示序列从开始到结束每隔"1"个元素的序列。
序列之间可以使用"+"进行连接操作。连接后的结果还是相同类型的序列,不同类型的序列不能进行连接。
序列之间不仅可以做"+"加法,也可以做"*"乘法,乘法可以帮我们复制多份序列。
长度、最小值、最大值、求和
- len()函数可以获取序列的长度
- min()函数可与获取序列的最小值
- max()函数可以获取序列的最大值
- sum()函数可以对序列求和
求和的要求是序列的元素必须都是int类型
3.3.2 列表
列表元素的更新,可以通过索引获取其中的单个元素,也可以通过索引更新其中的元素,更新列表的索引必须是已经存在的索引。
列表不能通过索引的方式增加元素,若要增加元素得通过append的方法实现,append是直接在原来的列表上新增的一个个元素,append一次只能增加一个元素,若要增加多个元素,需要使用extend的方法,同样是在原来列表末增加。若要实现插入,需要insert的方法。
列表删除元素:
-
pop()函数指定删除列表中的一个元素,并返回该元素的值,默认是最后一个元素。
-
remove()函数根据元素的内容进行删除,remove会删除查到的第一个元素,并且没有返回值。
-
del关键字进行删除。
查找元素:
index()方法查找元素在列表中的索引
如果列表中没有该元素,会报错!
反转队列,用reverse方法反转队列,和[::-1]类似,但是revers是直接反转队列,没有返回值。
count方法用于统计元素在列表中出现的次数
sort方法用于对列表进行排序,和reverse方法一样没有返回值。
3.3.3 元组
元组与列表很相似,最大的区别是列表可以修改、删除,而元组不能修改元素,也不能删除单个元素,但是可以删除整个元组。
元组与列表定义方式类似只是注意的是定义一个元素的元组时要在元素后面加逗号(a,),不加逗号表示该元素本身。
元组的删除操作,因为元组无法修改所以不能删除部分元素,只能整个元组。
元组的查询方法与列表一样,因为元组不能修改,所以元组的查询速度要比列表快。
3.3.4 字典
字典的作用就和其本身的含义一样,可以像字典一样去查找,字典的元素是成对出现的,每个元素都是由键(key)":" 值(value)构成,元素之间以","隔开,字典的键必须是唯一的,整个字典以{}包围。
字典可以像列表一样用索引去查找、修改键所对应的值。
字典的添加和删除
可以使用像修改字典的语法去添加新的元素
可以用del方法删除某个元素
使用clear方法清空字典元素
使用copy方法返回一个内容相同的字典(是一个新的字典,占据新的储存空间)
可以用fromkeys方法创建一个新字典,用序列的元素作为字典的键,还可以指定默认的值。
可以用get的方法返回对应的值,如果字典不存在对应的键,就返回默认值。
使用keys方法可以返回一个包含字典所有键的视图对象
使用values方法可以返回一个包含字典所有值的视图对象
使用items方法可以返回一个包含键和值的试图对象
3.4 流程控制
所有编程语言都有流程控制,流程控制通常包括顺序控制、条件控制、循环控制。
3.4.1 if语句
基本语句:
if 判断条件:
执行语句
else:
执行语句
"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。
else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句。
python 并不支持 switch 语句,所以多个条件判断,可以用 elif 来实现,elif只能与if配合使用,elif相比于多个if的好处是:如果是用 if 的话,他会一直遍历完所有的if,不管你想判断的条件有没有遍历到,他都会继续执行完所有的if;而 elif 呢,则会比较快捷。
if 判断条件1:
执行语句
elif 判断条件2:`
执行语句
else:
执行语句
3.4.2 循环语句
Python主要有两种循环结构:while循环,for循环。
while循环
while语句后的表达式和if语句一样,只有条件满足时,才会执行while循环体内的语句。
while 判断条件:
执行语句
for循环
Python中for循环比while循环用得更多,语法格式如下:
for 变量 in 序列:
执行语句
变量会遍历序列里的每一个元素,遍历完后结束循环。
range
Python内置了函数range,range有两种使用方式:
第一种是:给定一个数字 range(10) 会返回一个可迭代对象(类似于列表)
第二种是:给定开始和结束的数字,并且可以定义步长。 range(0,10,2)
break与continue
break:可以立即退出整个循环
continue:可以跳过当前循环,执行下一次循环。
3.5 函数
编程中经常要进行一些相同或类似的操作,而函数的功能就能让我们避免这些重复操作。
3.5.1 函数的定义
定义函数语法如下所示
def 函数名(函数参数):
函数内容
函数返回值
- 函数名:以字母或下划线开头,后面可以跟字母、数字、下划线。
- 函数参数:调用函数是可以传递的参数,参数可以有一个或多个,也可以没有参数。
- 函数内容:需要缩进四个空格(python对格式有强制性要求)。
- 函数返回值:函数执行完返回的值,也可以不返回任何内容。
例子:
def printf(name):
print("hello",name)
return None
printf("world")
输出结果:
hello world
3.5.2 参数
必须参数
当有n个参数时,必须传入n个参数,且默认参数顺序与函数定义时一样。
def people(name,age):
print("名字:",name)
print("年龄:",age)
people("小明","18")
输出结果:
名字: 小明
年龄:18
关键字参数
用关键字可以调换参数传入顺序
def people(name,age):
print("名字:",name)
print("年龄:",age)
people(age="18",name="小明")
输出结果:
名字:小明
年龄:18
默认参数
当有默认参数时可以不传入该参数,会用默认值。
默认参数定义必须在没有默认参数的后面
例如不能这样 : def(name="张三",age) ,这样定义函数会报错
def people(name="张三",age=16):
print("名字:",name)
print("年龄:",age)
people("小明")
输出结果:
名字:小明
年龄:16
def people(name="张三",age=16):
print("名字:",name)
print("年龄:",age)
people()
输出结果:
名字:张三
年龄:16
可变参数
当不确定参数的数量与内容时,可以使用可变参数
*args参数获取的是一个元组
**kwargs获取的是一个字典
语法如下:
def 函数名(*args,**kwargs):
函数内容
def fun(*args):
print(args)
fun()
fun("hello","world")
fun(11,"hi",3)
输出结果:
()
(hello,world)
(11,hi,3)
def fun(**kwargs):
print(kwargs)
fun()
fun(hello="你好",world="世界")
输出结果:
{}
{'hello': '你好', 'wworld': '世界'}
变量作用域
一般情况,在函数内部赋值的变量,都是局部变量,只在该函数内生效。例如:
def sum():
x=1
print(x)
sum()
print(x)
输出结果:
1
NameError: name 'x' is not defined
函数外面赋值的变量是全局变量,例如:
x=20
def sum():
x=1
print(x)
sum()
print(x)
输出结果:
1
20
若要使函数内的局部变量改为全局变量可以用 (global)关键字,例如:
x=20
def sum():
global x=1
print(x)
sum()
print(x)
输出结果:
1
1
返回值
想要获取函数中的局部变量可以用 return 的方法,例如:
x=20
def sum():
x=1
print(x)
result=sum()
print(result)
print(x)
输出结果:
1
1
20
如果没返回值,则返回None。
4.面向对象
早先的编程语言都是面向过程的,这是一种将数据与操作分离开的思想,对于每个数据都要进行单独的处理。后来在c++、python等语言中引入了面向对象的编程思想。面向对象编程其实就是通过程序去操作一个具体的对象。对象可以将数据与方法进行封装,操作时,只需调用接口就能进行一些复杂的操作。
4.1 类与对象
类(class)和对象(object)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。
4.1.1 对象
对象可以是一样具体的东西,也可以是无形的。以我们的角度去看,对象可以分为两个部分:属性、行为。
对象属性:属性它可以是对象的状态,也可以是一些变量
对象行为:行为它可以是完成某事的方法,也可以是对象自身的一些行为。
例如:
4.1.2 类
类是相同的类似对象的一个统称,以人为例,人可以看作是一个类,一个具体的人可以看作是一个对象。我们每个人(对象)都有自己的名字、年龄等属性和吃饭、睡觉等行为。类是对象的抽象,对象就是类的实例化、具体化,类可以定义一些对象通有的属性和行为。
例如:
4.2 语法
- 类:用来描述具有相同属性或方法的对象的集合
- 类变量:类定义的变量在该类实例化对象中是公用的
- 实例化:创建一个类的实例,一个类的具体对象。
4.2.1 类定义
class 类名:
语法
4.2.2 类使用
使用类需要先实例化一个对象,然后通过对象去操作。
python中定义构造函数的方法是类的__init__方法。
构造函数是指当你在实例化一个对象时会调用该函数初始化对象。
该方法构造的构造函数只能返回None,否则实例化对象时会报错。
class Dog:
def __init__(self,name):
self.name=name
self.age=12
dog1=Dog("张三")
print(dog1.name)
print(dog1.age)
输出结果:
张三
12
class Dog:
def __init__(self,name):
self.name=name
self.age=12
def fun(self):
print("我的名字是",self.name)
print("我今年",self.age,"岁了")
print("汪汪汪!")
dog1=Dog("张三")
dog1.fun()
输出结果:
我的名字是 张三
我今年 12 岁了
汪汪汪!
4.2.3 私有属性
我们有时候不希望别人用实例化对象修改属性,这时就可以用私有属性来完成这件事情。
我们只需要在变量前加上 __ 那么这个属性就是私有属性了。
添加私有属性前:
class Dog:
def __init__(self,name):
self.name=name
self.age=12
dog1=Dog("张三")
print(dog1.age)
dog1.age=2
print(dog1.age)
输出结果:
12
2
添加私有属性后:
class Dog:
def __init__(self,name):
self.name=name
self.__age=12
dog1=Dog("张三")
print(dog1.__age)
dog1.__age=2
print(dog1.__age)
输出结果:
AttributeError: 'Dog' object has no attribute '__age'
我们发现私有属性不能被外部访问和修改,但是类里面的函数任然可以对私有属性进行访问和修改。
例如:
class Dog:
def __init__(self,name):
self.name=name
self.__age=12
def set_age(self,age):
self.__age=age
print(self.__age)
dog1=Dog("张三")
dog1.set_age(2)
输出结果:
2
4.2.4 私有方法
我们也可以对函数进行私有化,这样外面就无法调用这个函数,只能通过类里面的方法对私有函数进行调用。
直接调用私有函数结果:
class Dog:
def __init__(self,name):
self.name=name
self.age=12
def __fun(self):
print("我的名字:",self.name)
print("我对年龄:",self.age)
def say(self):
self.__fun()
dog1=Dog("张三")
dog1.__fun()
输出结果:
AttributeError: 'Dog' object has no attribute '__fun'
类里面函数调用结果:
class Dog:
def __init__(self,name):
self.name=name
self.age=12
def __fun(self):
print("我的名字:",self.name)
print("我对年龄:",self.age)
def say(self):
self.__fun()
dog1=Dog("张三")
dog1.say()
输出结果:
我的名字: 张三
我对年龄: 12
4.3 继承与多态
4.3.1 继承
继承性是面向对象编程三大特性之一。继承是在一个类的基础上,制定一个新的类,这个新的类可以继承使用原来类的属性和方法,还可以在原来类的基础上增加新的属性和方法。
定义子类的语法如下:
class 子类名(父类名1,父类名2):
语法
示例代码:
class Animal:
def __init__(self,name):
self.name=name
def put(self):
print("我的名字是:",self.name)
class Cat(Animal):
def play(self):
print("你好~")
cat1=Cat("小咪")
cat1.put()
cat1.play()
输出结果:
我的名字是: 小咪
你好~
继承两大注意事项:
- 如果子类定义了构造函数的方法,则父类的构造函数不会被调用
- 子类不能继承和调用父类的私有方法
1.示例代码:
class Animal:
def __init__(self,name):
self.name=name
def put(self):
print("我的名字是:",self.name)
class Cat(Animal):
def __init__(self,name):
print("我是",name,"你好~")
cat1=Cat("小咪")
输出结果:
我是 小咪 你好~
可以使用super函数调用父类的构造函数
class Animal:
def __init__(self,name):
self.name=name
def put(self):
print("我的名字是:",self.name)
class Cat(Animal):
def __init__(self,name):
super(Cat,self).__init__(name)
cat1=Cat("小咪")
cat1.put()
输出结果:
我的名字是: 小咪
2.示例代码
class Animal:
def __init__(self,name):
self.name=name
def __put(self):
print("__put调用")
def put(self):
print("put调用")
class Cat(Animal):
def __init__(self,name):
super(Cat,self).__init__(name)
cat1=Cat("小咪")
cat1.put()
输出结果:
put调用
class Animal:
def __init__(self,name):
self.name=name
def __put(self):
print("__put调用")
def put(self):
print("put调用")
class Cat(Animal):
def __init__(self,name):
super(Cat,self).__init__(name)
cat1=Cat("小咪")
cat1.__put()
输出结果:
AttributeError: 'Cat' object has no attribute '__put'
4.3.2 多态
继承让我们可以使用父类的属性和方法,而多态就是定义子类自己独有的属性和方法(会覆盖掉从父类继承的方法)
示例代码:
class Animal:
def __init__(self,name):
self.name=name
def put(self):
print("这里是Animal",self.name)
class Cat(Animal):
def put(self):
print("这里是Cat",self.name)
class Dog(Animal):
def put(self):
print("这里是Dog",self.name)
cat1=Cat("小咪")
dog1=Dog("旺财")
cat1.put()
dog1.put()
输出结果:
这里是Cat 小咪
这里是Dog 旺财
5.错误与异常
5.1 处理异常
处理异常会用到两个关键字:try和except,如果没报错执行try下面的代码,报错则执行except下面的代码。
try,except语法:
try:
执行内容
except:
执行内容
5.2 常见错误
异常名称 | 描述 |
TypeError | 类型错误,对象用来表示值的类型非预期类型时发生的错误 |
AttributeError | 属性错误,特性引用和赋值失败时会引发属性错误 |
NameError | 试图访问的变量名不存在 |
SyntaxError | 语法错误,代码形式错误 |
KeyError | 在读取字典中的key和value时,如果key不存在,就会触发KeyError错误 |
IndexError | 索引错误,使用的索引不存在,常索引超出序列范围,序列中没有此索引 |
IndentationError | 缩进错误 |
ValueError | 无效参数 |