Python基础
1:环境安装
安装python编译环境,推荐pycharm或subline,pycharm专业版安装具体教程见压缩包
2:python的注释、缩进、输入及输出
这里通过第一个python程序来引出python输入、输出的方法
1 | # 这是第一个python程序 |
2.1:注释
该例子可以看到第一句为注释,用#
开头
python的注释有两种,单行注释用 #
,多行注释用一对三个单引号或者双引号将需要注释的多行包起来,例如:
1 | """ |
2.2:缩进
python不像C那样会用严格的大括号或者小括号来保证代码正常运行,它通过规范且严格的缩进来保证代码正常运行,在使用一些函数,如if、while、for等结构时,正确的缩进是代码正常运行的第一步,后面在代码示例和其他章节会看到。
2.3:输入
该例子的第二句使用input
函数来获取用户输入的内容,并赋值给定义的变量name
,后面会详细介绍获取用户输入的数据类型
python交互式命令行会输出input
函数内的内容,并等待你的输入,当你输入完成后回车即可,在该例子中回车后,用户输入的内容被赋值给变量name
2.4:输出
该例子的第三句使用print函数输出函数内的内容,字符串Hello,world用单引号引起来,通过 + 将该字符串和变量name对应内容一起输出。
●注:python3中print函数输出的内容必须要用一对小括号括起来,python2不用
3:数据类型和变量
3.1:数据类型分类
常见的数据类型有整型(整数),浮点型(小数),字符串,布尔值,空值
整数和浮点数
整数为int类型,浮点数为float类型。整数除了常见的十进制,还有二进制、八进制、十六进制等,这些进制在代码中的表示都以数字‘0’开头
●注:关于进制转换,这里不做详细讲述,可以自行百度或查找书籍
二进制的表示方法:以0b开头,例如:0b110011代表的就是十进制的51
八进制的表示方法:以0o开头,注意这里的第二个字符是英文小写‘o’
十六进制的表示方法:以0x开头
数字的格式化输出:
何为格式化输出?就是按照规定的格式对数字进行输出,比如小数点后保留几位,左对齐、右对齐还是中心对齐,占位字符长度。格式化输出常用format函数实现,format函数的具体用法看下面的详细举例。
举例:
1 | x = 11585.354654654684 |
运行结果如下:
format函数的用法还有很多,可以查看该函数的详细用法
字符串
字符串为str类型,一串字符串用引号引起来,注意字符数字和单纯数字的区别
例如:‘456’ 是字符串,而456就是单纯的数字,数字可以用于逻辑运算,字符串就不可以,例如下面的两段代码:
1 | a = input('请输入一串数字:') |
1 | a = input('请输入一串数字:') |
字符串的输出
当字符串内有特殊字符时,比如\n、\等需要正常输出时,可以使用反斜杠\对特殊字符进行转义,或者直接在字符串前面加‘r’,就可以正常完整输出原来的字符串了
例如:
字符串的格式化
字符串的格式化就是将字符串设置为一个模板,当一个字符串中的部分内容是固定的,例如输出一万个学生的成绩,设置字符串模板进行输出可以更加方便。之前已经提到过format方法,可用于字符串的额标准化输出,format方法也可用于格式化当前的字符串。
1:使用%定义字符串模板
1 | #定义字符串模板 |
2:format方法
format方法有别于前面的%定义字符串模板的一点是使用{}来定义字符串模板,同时也可以指定格式化参数的值
1 | #定义字符串模板 |
布尔值
布尔值只有“0”False和“1”True之分
布尔值常用于条件判断,两个布尔值或布尔变量也可以用于and、or、not运算
例如:
1 | print(5 > 3 and 3 < 1) |
3.2:变量
变量顾名思义其值可以改变,变量的类型可以为任意数据类型,变量名尤其定义的规则,必须是英文大小写、数字以及“_”的组合,并且不能用数字开头,且不能与语法内的关键字重复,比如定义一个变量就不能使用int,for,from等等这些关键字
整型变量用int类型声明
浮点型变量用float类型声明
字符串用str类型声明
例如:
1 | a = 12354 |
4:常见的逻辑运算
加法
除了常见的数字相加,字符串也可以用“+”连接输出
减法
“-”除了能用于减法运算,还能表示负数和列表的切片(切片后面列表章节再细讲)
除法
除法运算,取整使用“/”,例如:5/2的结果为2
取余
除法运算取余使用“%”,例如:5/2的结果为1
幂
幂运算也就是乘方,使用“**”
1 | a = 5 |
5:列表、元组、字典
5.1:列表
列表是一种有序集合,列表内的元素的数据类型不同于C语言,可以不同,甚至可以为列表本身。
列表的基本操作:赋值、索引、连接、分片
先定义如下的列表:
1 | name = ['张三','李四','王五','景一'] |
输出结果如下:
可以看到输出的结果仍然为列表
列表可以通过正负数来索引
1 | name = ['张三','李四','王五','景一'] |
输出结果 如下:
列表的切片
1 | number = [567, 78, 567, 567, 687, 678, 3546, 5765, 576] |
同样的切片用法也可以用于元组
列表生成式
写列表生成式,要把生成的元素或表达式写在前面,后面跟for循环,就可以吧想要的list创造出来,在列表生成式里,for循环后面还可以跟if条件判断用于筛选,也可以进行两层循环生成全排列
1 | #生成一个10以内数字的乘方列表 |
5.2:元组
元组的定义
1 | #定义一个空元组 |
元组的输出
1 | math = (98,98,97) |
5.3:字典
对于列表来说,查询某个元素的唯一方法就是通过索引,而字典是通过键值对存储的,一个key对应一个value,所以可以直接通过key来查询对应的value,而不需要知道其对应的索引,因此具有极快的查询速度,但其缺点是会占用大量的内存。
字典的定义
1 | #字典的定义 |
dict函数的使用
使用dict函数可以将其他映射(如其他的字典)或键值对的序列建立字典,例如当返回的值是一个键值对序列的列表,则可以通过dict函数建立字典
1 | info = [["张三",'098978'],["李四",'098965'],["王五",'098976']] |
字典的基本操作
- len(dict):返回dict中键值对的数量
- dict(key):返回key对应的值
- dict(key) = value :若该key原来存在,重新给该key赋值,若该key不存在,则在key中添加一个新的元素
- del dict(key):删除键为key的值
- key in dict:检查dict中是否含有键为key的值
字典的迭代
1:获取字典的key列表:直接使用for循环对字典中的key进行遍历,也可以使用keys方法
1 | info = [["张三",'098978'],["李四",'098965'],["王五",'098976']] |
2:同时获取字典中的key和value列表:使用items方法
1 | info = [["张三",'098978'],["李四",'098965'],["王五",'098976']] |
3:反序列迭代:可以通过reversed函数将一个序列反转
1 | info = reversed([["张三",'098978'],["李四",'098965'],["王五",'098976']]) |
6:if条件语句以及while、for循环
if 循环
1 | n = 10 |
断言
在python中断言需要使用assert语句,在assert关键字后面指定断言的条件表达式,如果不满足条件表达式的内容,就会抛出异常,如果满足就会按照顺序执行后面的语句。
1 | a = 10 |
while 循环
1 | n = 1 |
for 循环
打印一个由*号构成的菱形
1 | #打印一个自定义高度的由*号构成的菱形,下一层比上一层多两个*号 |
7:函数
7.1:函数的定义以及三要素
函数是可以调用并且交互的,函数的三个重要因素是函数名、函数参数以及返回值。下面以定义一个使用辗转相除法求最大公约数的函数为例
思路:
1:先判断需要求公约数的两个数a、b是否都大于0
2:判断a和b那个更大
3:c=a%b
4:若C等于0,则b为最大公约数,否则a=b,b=c,继续c=a%b
5:当c=0时,求得最大公约数为b
1 | #定义一个函数使用def语句 |
7.2:递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。使用递归函数时要注意栈溢出,即在函数返回时调用自身,并且return语句里不能包含表达式,可以通过尾递归的方式进行优化。
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
以求n的阶乘为例:
1 | def fun(n): |
8:可迭代对象、生成器、迭代器
在学习生成器和迭代器之前需要先了解什么是迭代,何为可迭代对象
8.1:可迭代对象
如果给定一个列表或者元组、字典,我们可以通过for循环来遍历这个列表或元组,这种遍历称之为迭代,而被用来迭代的列表、元组、字典等称其为可迭代对象
在python中迭代是通过for XXX in
的结构实现的,而在C语言和其他一些程序语言中,迭代是通过遍历下标索引实现的。对于可迭代对象无论其是否拥有下标,都可以进行迭代,比如字典就可以遍历键或值
练习:使用迭代查找一个list中最小和最大的值,并返回一个元组
1 | #定义一个函数用于查找一个list中最小和最大的值,并返回一个元组 |
8.2:生成器
创建一个列表时, 会将列表所有元素装载在内存里,而且是一块连续的内存空间,当一个列表内的元素有很多时,使用列表就会占用过多的内存,而且实际上创建的列表在当时很有可能只用到部分或少量元素,因此生成器(generator)的出现解决了这个问题。
在循环的过程中,通过某种算法不断的推算出后续的元素,边循环边计算的机制就称之为:生成器
(1):生成器的创建
- 把一个列表生成式的[]改成(),直接在()里用表达式推算出后续的元素,并生成一个迭代器
- 用函数来实现,当一个函数定义中含有yield关键字,那该函数就是一个generator,变成generator的函数遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
(2):示例
1 | #求10以内整数的平方,要求通过迭代器实现 |
把杨辉三角的每一行看做一个list,用函数写一个生成器,不断输出下一行list
1 | #定义一个生成器 |
8.3:迭代器
生成器不但可以被for循环遍历迭代,而且可以用next()函数不断调用并返回下一个值,直到最后抛出无法返回的报错。生成器都是迭代器对象,但是列表、字典、字符串等是可迭代对象,却不是迭代器,可以使用iter()函数将其变成迭代器
小结
凡是可作用于for
循环的对象都是Iterable
(可迭代对象)类型;
凡是可作用于next()
函数的对象都是Iterator
(迭代器)类型,它们表示一个惰性计算的序列,长度未知,有可能无限。
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
9:高阶函数 map() reduce() lambda()函数
9.1:map函数
map(函数,interable[,…]) map()函数第一个参数为函数,可以str,int,函数名等,第二个参数为可迭代对象(序列),
map函数的作用是第二个参数对应的序列全部用于第一个参数对应的函数,最终map函数返回结果为新的Iterator,可用list()函数返回的序列转化为list对象
9.2:reduce函数
reduce(函数,序列) 而这个函数必须接收两个参数,第一次使用第二个参数序列中的前两个值,然后reduce把结果继续和序列的下一个元素做累积计算
相当于reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
9.3:lambda函数
lambda()函数为匿名函数,只是一个表达式 用法:lambda 参数1,参数2,…:表达式
1 | from functools import reduce |
1 | # -*- coding:utf-8 -*- |
10:类和实例以及方法和属性
面向对象编程
在python中所有的数据类型均可视作为对象,也可自定义对象,自定义的对象的数据类型就是类。面向对象编程是一种程序设计思想,把对象当做程序的基本单元,一个对象包含了数据和操作数据的函数。就比如Student,学生看做一类对象,而一个学生有姓名、年龄、成绩等多种属性,当需要处理学生的成绩时,向Student发送消息,让其执行对应的关联函数,这里的关联函数就是对象的方法,给某个对象发送消息让其执行它的某一方法,这就是面对对象编程。
10.1:类和实例
类是一个抽象概念,比如Student类,用来描述学生一类对象,而学生这一类对象里有很多个单独的个体,每一个具体的个体称为实例,因此实例是根据对象创建的一个个具体的个体,各自的数据可能有所不同。
类的定义
类是通过class
关键字定义的:
1 | class 类名(首字母大写) (继承类名): |
通常,如果没有合适的继承类,就使用object
类
实例的创建
创建实例是通过:类名 + ()实现的
1 | class Student (object): #定义了一个Student的类 |
10.2:方法和属性
创建类时,通过定义一个特殊的__init__
方法,该方法能把我们认为必须绑定的属性强制写进去,那何为属性呢?对于一个学生的实例,年龄、性别、学号等都可以是该实例的属性,每个实例都可以自定义自己独有的属性,但像学号、性别、年龄这些必须的属性就可以写在Student类的__init__
方法中,这样在每创建一个实例时都会包含这些必须属性。
创建一个汽车Car类,分析类、实例、方法、属性之间的关系
1 | #创建一个汽车的类 |
访问限制
在类内部,有属性和方法,外部代码可以直接调用实例变量的方法来操作数据,要想内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,在python中,实例的变量名如果以__
开头,该变量就变成了一个私有变量,只有内部可以访问,外部不能访问,除非在类中添加供访问或修改的方法,才可以访问或修改。
1 | #将上面代码的year改为私有变量 |
运行抱错:AttributeError: 'Car' object has no attribute 'year'
在类中,定义一个调用year
的方法get_year
才可以调用该变量
1 | #定义一个方法,打印输出车辆的信息 |
运行能够正常输出:2019
10.3:类的继承
在面向对象程序设计时,当我们定义一个类时,可以从以前的定义的类继承,新的class称为子类,而被继承的class是父类
例如前面的Car可以看做一个大类,而定义子类:newpower_car和traditional_car两种子类,代表新能源汽车和传统汽车,子类可以获得父类的所有功能,除此之外自己也可以定义新的方法
1 | #创建一个汽车的类 |