1.1 编程语言和python介绍
计算机分为软件和硬件,硬件就是我们看得见,摸得着的,比如显示器,鼠标,键盘,CPU,内存,硬盘。
软件是一段数据,存储在内存或硬盘,这段数据记录了一段指令,通过这些指令来操作计算机硬件。
开发软件就是开发一套机器能识别指令来完成特定的功能,这个的过程被称为编程,编程所使用的工具是编程语言。
1.1.1 机器指令与汇编语言
编程语言最初是直接用机器指令,通常是一段二进制数据,如0101..,机器指令很直接,直接就可以操纵硬件
比如让CPU运行加减,乘除,让内存存储数据。
掌握了机器指令,相当于直接和硬件对话,让硬件做什么就做什么,但是,机器指令是由一个个0101之类的二进制数构成,
掌握机器指令,过于复杂又难以记忆。于是有人就发名了一种助记符,把英语单词和机器指令对应起来。
如下面的表格
功能 | 机器指令 | 助记符 |
---|---|---|
加 | 0100 | ADD |
减 | 0101 | SUB |
这样以后再编写程序就可以不用0100来表示加法了,而是使用助记符ADD来编写,这样,可以让编写程序的人轻松不少,最后再统一替换成对应的二进制指令。
这种用助记符编程的工具就是汇编语言。
1.1.2 低级语言和高级语言
后来又有人觉得汇编语言麻烦,因为汇编语言实际上就是对机器指令的一对一替换,虽然记忆指令方便了,但是在控制计算机硬件的时候还要事无具细的控制。
比如实现一个小小的功能,在显示器上显示文本,可能都需要数十行的代码来编写。
于是有人研究出了更高级的编程语言,如C语言,这种较高级的语言,把一些控制硬件琐碎的操作进行的封装,直接用很少的代码就可以代替汇编或机器指令一段常用的代码。
这样用C语言编写代码更有易于从逻辑上去思考,而不是把精力浪费在对机器硬件繁锁的操作上。
实际上最终想要在硬件上运行,还是要把C语言编写的代码替换成对应的机器指令来执行,不过这事就由编译程序来做就可以了,程序员只负责写C语言代码即可。
C语言虽然是一大进步,告别了繁琐的硬件操控,但是仍然包含了很多关于内存的操控,比如创建数据时,要申请内存空间,当不想使用数据时,要手动释放内存空间。
当我们编写程序的时候还要考虑内存的申请和释放,这可能会影响我们编写的思路。
所以在C语言的基础上,出现一些更高级的编程语言,大部分是针对C语言进行的再封装,把C语言中常用的功能代码段,操作指令,还有C语言编程过程中需要考虑的一些细节封装。
让编写程序的人只考虑程序的组织逻辑,尽量的少去思考硬件的相关的东西,这种语言就是高级语言。
常见的高级语言有C++,JAVA,PYTHON, GO...
python 就是一门高级语言,我们称C语言为低级语言。
高级语言因为封装了更多的东西,所以编写程序的速度会很快,比如实现一个功能,用C语言需要用几百行代码来实现,用python可能只需要写几行代码来实现。
但是最终想在计算机中运行,还是要翻译成机器指令来执行。高级语言在翻译的过程中,会产生更多的无用操作,没有低级语言直接。所以高级语言的执行速度不如低级语言。
种类 | 代表语言 | 执行效率 | 开发效率 |
---|---|---|---|
低级语言 | C | 快 | 慢 |
高级语言 | Python | 慢 | 快 |
那么到底是执行效率重要还是开发效率重要呢?不同的应用场景下,选择也不一样。
比如操作系统,位于底层,一切软件运行在操作系统之上,如果操作系统都不快,那运行在操作系统上的软件也快不了,
另外操作系统本身的功能也是需要经常和硬件来打交道。所以开发操作系统,肯定首选C这种低级语言。
软件公司,可能为了抢占市场,一个领域的商机发现之后,当然希望快速的开发出来,尽早面市,这种情况会选择高级语言,因为相比于那一点点效率,产品的研发速度更重要。
实际上高级语言虽然慢,但是通常情况下大家是可以接受的,比如C语言运算一个功能需要0.001秒,python需要0.1秒,虽然速度差了一百倍,但是我们大部分情况下是感知不出来的。
1.1.3 Pyhon语言介绍
首先python 是一门高级语言。
python 还是是解释型语言。
高级语言想要在计算机上运行,必须翻译成机器能识别的指令,即机器码来运行。
如何翻译成机器指令,分为两种
- 编译型语言,直接把高级语言的代码翻译成机器可识别的指令然后保存下来,接下来每次运行,都直接运行翻译后的机器代码就可以了。
- 解释型语言,需要有一个解释器,运行时由解释器一行一行的翻译成机器代码并运行。
python还是一门可移植的语言
可移植的语言可以理解为一套代码可以在不同的平台,操作系统上运行。常的操作系统如windows, linux, mac osx, unix..
由于是解释型语言,所以Python运行的环境只要有python解释器就可以,不存在平台的限制。
python是一门面向对象的语言
面向对象是一种当下最流行的软件开发方法和开发思想,把现实事物模拟成计算机代码中的对象处理,现实事物可以有数据和行为,
就可以对应面象对象语言中的类的属性和方法。面向对象的核心,封装,继承,多态,在python中都有非常好的支持。
python的解释器根据开发的言不同,分为以下几类
- CPython 使用C语言开发的解释器,目前最流行,使用最广的解释器
- Jython 使用java语言开发的解释器,可以很好的和java语言交互,可以把python直接编译成对应的Java代码
- Ironpython 使用C#开发的解释器,可以很好的和微软的.Net平台交互。
- Pypy 使用python语言子集开发的解释器,采用JIT技术,做了大量的优化,解析速度是所有解释器里最快的,比Cpython还要快很多倍
python语言本身是有版本的,因为Python本身也需要不断的完善
一般情况下,小版本的变更没有太大的影响。
不过Python有两个大版本,即Python2和Python3
这是两个不兼容的版本,因为python语言为了使自己变得更完善,内部做了大量的优化,导致Python3和Python2的一些内容不一样,
最明显的就是同样的代码在python3上可以运行,在python2上不能运行。
目前官方已经不再维护Python2的版本,这是一个已经被时代废弃的版本。
目前所有的项目都在从Python2转到python3,学python2已经没有多少意义了。
不过Python2和python3对于编写程序的人来说,影响并不是特别大,个别的一些用法不同,只需要稍微调整一下就可以了。
1.2 Python安装及执行
1.2.1 安装解释器
想要编写并运行Python代码,第一步,就是安装一个Python的解释器。
我们可以去Python官网下载一个python3的解释器
https://www.python.org/downloads/
挑选一个适合自己操作系统的解释器安装即可。
1.2.2 运行Python代码
运行python代码有两种方法
第一种是把代码写到文件当中保存,调用解释器解释文件。
比如我们新建一个记事本,在其中写上以下代码
含义是在屏幕上显示 “hello, python”
print("hello, python")
然后保存为 helllo.py文件
想让解释器解释我们的代码文件,就直接把文件的路径告诉解释器就可以了。
打开命令行,输入python解释器的路径 + 源文件的路径
第二种是直接打开解释器,在解释器中输入一行代码,解释器就立即解释执一行代码
这种被称为交互模式,主要是用来调试的, 在命令行中直接输入python解释器的路径,就可以直接运行
其中,>>> 后面就可以输入我们想要让解释器解释的代码
1.2.3 源文件的编码
只要涉及到文本,就涉及到编码
我们的python代码文件也是由文字组成的,所以python代码文件也隐含了一个编码问题
在python3 当中,解释器会默认认为我们的python文件是UTF-8格式的编码
UTF8是通用的编码格式,也是现在的主流。
但是如果我们不想让解释器以UTF8格式编码解析,我们就可以在代码文件第一行,加上下面的
这样解释器就会以gbk编码来解析我们的代码文件
# -*- coding: gbk -*-
如果在linux上,可能会加上一行解释器的路径 ,这时就需要把coding放在第二行
#!/usr/bin/env python3 # -*- coding: gbk -*-
1.2.4 环境变量
如果每次都在命令行里输入这么长的python解释器路径,觉得很麻烦,那有一个方法,就是我们把Python解释器的路径告诉操作系统
之后我们运行解释器就不用把完整的路径也输入出来了。
如何告诉操作系统呢,操作系统有一个环境变量叫path,我们把python的路径加进去就可以了。
win10环境变量打开方式
这里给出win10环境变量的配置方法
https://jingyan.baidu.com/article/c33e3f483ab7d4ea14cbb548.html
把Python的安装路径配置进去之后,在命令行里直接输入python,就代表运行python解释器了。
1.2.5 PyCharm-最好的IDE
IDE就是集成开发环境,(Integrated Development Environment)就是一个我们用来帮助开发Python代码的软件
如果我们不用IDE,写一个python代码文件,要用记事本编写,再保存,再用python解释器去执行,有点麻烦,
使用了IDE后,可以快速的新建文件,编写代码,而且代码出错会有提示,
执行代码,只需要鼠标点一下,或者快捷键按一下,就可以让代码运行起来,
其实用性还远不止如此,总之一句话,IDE就是让你舒服,一些麻烦事他来帮你做,你只需要关注写代码就行了。
目前开发python代码最好的工具就是PyCharm。
PyCharm分为两种版本
- 社区版:提供python开发的基础功能,重要的是,免费
- 专业版:不但有基础功能,还额外提供了WEB开发的功能,比如CSS,JS,HTML,SQL等,但是专业版收费
用哪个版本,这个看自己的实际需要,建议可以先用社区版学习Python,如果有需要,再考虑用各种方式获得专业版软件。
当然如果有条件,就直接安装使用专业版。我只知道专业版是要收钱的,不花钱能不能用,我就不知道了。。。
pycharm 官网下载地址
https://www.jetbrains.com/pycharm/download/
Community就是社区版, Professional就是专业版
1.2.6 jupyter
python内置有很多别人实现好的功能,都放在仓库里了,有的东西是在python语言里面的,
由python官方提供的,叫做标准库可以直接拿来用,有些东西是一些技术特别厉害的人或组织提供的,叫做第三方库
想用第三方库,需要去网上下载,python所有的第三方库会放在一些固定的网络上,这些网络叫源,
获取第三方库很简单,只需要简单使用pip命令就可以了,
比如我们这里想安装一个jupyter
pip install jupyter
默认pip 去获取的第三方库的源是国外的网站,我们访问起来速度不行
那我们可以通过配置,改变这个获取第三方库的源,
需要通过一些配置,来改变源
比较常用的国内源有:
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/ (2)豆瓣http://pypi.douban.com/simple/ (3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ (5)华中科技大学http://pypi.hustunique.com/
如果只是想临时修改
在使用pip的时候,加上参数-i和源地址
pip install -i http://mirrors.aliyun.com/pypi/simple/ jupyter
如果想每次使用pip源都使用修改后的,不用加-i参数
那就使用永久方法,把源地址配置一下
liux上修改源
创建或修改 ~/.pip/pip.conf
windows上修改源
创建或修改 c:\Users\用户名\pip\pip.ini
[global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = http://mirrors.aliyun.com
安装 jupyter后,在命令行里输入命令运行
jupyter-notebook
1.3 变量及命名规则
1.3.1 什么是变量
变量是用来存储可变数据的,我们在编写程序的时候,想要记录一些状态,比如一个人的身高,体重,名字,性别,
这些数据在程序运行时需要存储在内存中,记录下来,当有变化时,又可以去修改他们的值。
我们把内存可以理解为一个一个的小房间,变量理解为房间的门牌号。
房间里存放的是各种数据,数据可以随时变化,修改。
如 下面的代码
name = "张三" age = 18
name和age是变量,他们可以自已定义用什么符号(门牌号),
"张三"和 18是数据,用来记录张三的姓名和年龄状态
这些数据是保存在内存当中的,计算机的内存中有两个小房间中就存储着张三和18这两个值
1.3.2 变量命名规则
变量名(门牌号)可以自己起,但必须符合以下规则
必须以由字母或下划线(_)开头,并由数字,字母,下划线组成
比如合法的变量名
name123
_age_2
A_B_C_3_4
不合法的变量名
9abcd
ag(^ $t5
另外,变量名不能和python的关键字一样,否则会引起冲突
怎么知道python有哪些关键字呢?
在python解释器里输入下面两行代码
import keyword
print(keyword.kwlist)
变量名是区分大小写的
比如 name 和Name就是两个不同的变量名
DEL就不会和关键字del产生冲突
1.4 基本数据类型和运算符
数据存储在内存当中,是有类型的
这里先介绍三种最基本的类型
1.4.1 数字
数字分为两种,整数和浮点数
整数就数字,如,1314,8848,1234567890987654321
浮点数就是小数, 3.1415926, 0.001
1.4.2 字符串
字符串就是一段用引号包起来的字符,可以是单引号,双引号,三个单引号,三个双引号包起来
注意引号必须是英文中的引号,输入法要切换到英文状态下再输入
如 '你好', "孔雀东南飞", """夜落乌啼霜满天""", '''君不见黄河之水天上来''','Good Morning'
1.4.3 布尔
布尔只有两个值 True和False,对应真和假
当某件事,某个判断成立,就是True, 就是真的意思
反之就是False,是假的意思
1.4.4 运算符
运算符是用来运算数据的
先介绍两类运算符
1.4.4.1 算术运算符
运算符 | 功能 | 例子 |
---|---|---|
+ | 加法运算 | >>>100 +200 300 |
- | 减法运算 | >>>300 - 100 200 |
* | 乘法运算 | >>>2 * 5 10 |
/ | 除法运算 | >>> 3/2 1.5 |
% | 取余运算 | >>>10 % 6 4 |
** | 乘方运算 | >>>2 ** 10 1024 |
// | 整除运算 | >>> 3//2 1 |
算术运算符主要是用于对数字类型做运算,与数学上的运算概念是一致的。
所以运算的数据类型必须都是数字类型,如果我们用两个字符串做 除法,解释器就会给我们报错,
同样给出了提示,不支持字符串和字符串之间做除法运算
>>> '姑苏城外寒山寺' / '夜半钟声到客船'
Traceback (most recent call last):
File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: 'str' and 'str'
但是字符串和字符串之间是可以做加法运算的,其功能是,把两个字符串拼成一个字符串
>>> '姑苏城外寒山寺,' + '夜半钟声到客船' '姑苏城外寒山寺,夜半钟声到客船'
另外,一个字符串可以用来乘以一个整数,其功能是,把字符串重复多少次
>>> '鹅,' * 3
'鹅,鹅,鹅,'
1.4.4.2 关系运算符
关系运算符是用来运算两种数据类型的关系的,运算数据可能是多种类型,运算结果是布尔值
运算符 | 功能 | 例子 |
---|---|---|
== | 相等判断 | >>>1 == 2 False |
!= | 不等判断 | >>>'你好' != "你好" False |
> | 大于判断 | >>>100 > 99 True |
>= | 大于等于 | >>> 100 >=100 True |
< | 小于判断 | >>> 0.5 < 0.5 False |
<= | 小于等于 | >>> 1<= 2 True |
关系运算符还支持三种 连接运算, 中文含义叫与,或,非
and 并且(与运算), 两个同时为真才为真
or 或运算,两个有一个是真的,结果就为真
not 非, 把对应布尔值取反
比如
1 == 1 and 1 == 2 # False 1 != 1 and 1 != 2 # False 1 == 1 and 2 == 2 # True 1 == 1 or 1 == 2 # True 1 != 1 or 1 != 2 # True 1 != 1 or 2 != 2 # False not 1 == 1 # False not 1 != 1 # True
其它的运算结果为布尔值的还有 in, not in
is, is not
1.4.4.3 赋值运算符
赋值操作,是把数据和变量绑定起来,数据是存储在内存中的,所以每一个数据在内存中会有一个地址,类似于门牌号
赋值操作,直接上是让变量这种符号和数据内存中的地址(门牌号)建立起关系,以后访问内存中的这块数据,只需要使用变量名就要以拿到内存中的这块数据
最常用的赋值就是用一个等号
num = 123 name = '道可道,非常道'
也可以这样赋值,这种也叫序列赋值
x, y, z = 1, 2, 3
x, y = y, x
也可以链式赋值
x = y = z = 1
也可以增量赋值
x += 1 #等价于x = x + 1 下面的也都类似 y *= 2 x -= 1 y /= 2 x **= 2 y //= 2 x %= 2
1.5 程序设计
程序运行,分为三种基本的结构
- 顺序结构,正常情况下,解释器会自上而下一行一行的执行代码
- 选择结构,程序中出现分支,有选择的执行代码
- 循环结构,程序中重复执行一段代码
实际上任何一段程序都是由这三种最基本的结构来组成的,他们之间可以互相混合使用
比如选择结构中可以包括循环结构,循环结构中重复执行的内容可以是顺序结构,也可以带选择结构,也可以再包括一个循环结构...
1.5.1 输入和输出
为了写一些简单的程序,我们先介绍两个基本的函数, print 和 input
print函数是用来显示数据,把数据在命令行上显示 ,print函数可以显示任何数据,显示多个数据,用逗号隔开
>>> print('明月几时有')
明月几时有
>>> print(3) 3 >>> print(3+2) 5 >>> print(True, False, 1, '君问归期未有期') True False 1 君问归期未有期
input是用来输入数据,让我们可以在命令行上输入数据,收集到输入的数据后,传递给程序中的变量
input输入的数据统一都是字符串的格式, input后面的括号里还可以加入输入提示信息,用字符串来表示
1 >>> name = input("你好,请问你叫啥名?")
2 你好,请问你叫啥名? 3 帅比 4 >>> print(name) 5 帅比
第3行的名字是我们自己输入的,输入之后,把内容赋值给了变量name,第4行再打印出来
1.5.2 顺序结构
顺序结构就是自上而下的逐行执行,实际上学了以上的内容,我们就可以编写顺序结构的程序了
下面我们可以做两个练习感受一下。
练习一, 表示温度有两种单位,华氏度和摄氏度, 我们常用的是摄氏度,摄氏度转换成华氏度的公式, 华氏度=1.8 * 摄氏度 + 32
设计一个程序,用户输入摄氏度,输出对应的华氏度,

注意
- 代码中#号后面的内容 是注释,解释器会直接跳过这一行,解释下一行的代码
- input输入的是字符串,不能参与数算术运算,需要用float把字符串转换成小数,如果想转换成整数用int
练习二,用户输入数字,判断用户输入的是否是奇数,如果是奇数,显示True, 不是,显示False

1.5.3 选择结构
选择结构,是指程序有选择的执行,靠什么来选择呢,就是我们前面学到的布尔类型,True 和False
选择结构的一般句式是
if exp:
do something
elif exp: do something else: do something
解释器读到if 开始进行判断
exp是一个表达式,什么是表达式呢,表达式就是一段运算,包括数据类型和运算符,也可以是一个函数,只要运算之后会生成一个值。
什么是值呢,值就是可以被赋值给变量的数据。
exp的值换算成布尔值,如果是真,就执行在if exp下面的一段缩进的代码段
exp的值换算成布尔值,如果是假,就跳到elif exp 继续判断。elif 可以有多个,也可以一个也没有
.
.
.
如果所有的elif 后面的exp换算成布尔值都是假,就执行else下面缩进的代码段
其中只有if 语句是必须的,其它elif和else语句都是可选的,就是说可以不使用。
每一个分支下面的代码段,可以是任意的python语句,当然也包括if语句,所以if语句是可以嵌套的
选择语句程序基本执行流程
理解条件语句,我们可以做几个练习
练习一 输入成绩,如果60分以下,输出不合格,60~85分输出良好,85~100分输出优秀
score = input("请输入成绩:") score = float(score) if score < 60: print("不合格!") elif score < 85: print("良好!") elif score <= 100: print("优秀!") else: print("成绩异常!")
练习二 输入用户名和密码,如果用户名为 zhangsan, 密码为 123456, 输出登陆成功,否则输出 登陆失败

username = input("请输入用户名:") password = input("请输入密码:") if username == 'zhangsan': if password == '123456': print('登陆成功') else: print('登陆失败') else: print('登陆失败')
上面这段代码不是最优解,只是为了演示选择语句的用法
1.5.4 循环结构
循环结构是用来重复执行一段代码的,如何判断是否重复和结束重复呢,还是用一个结果为布尔值的表达式来判断
循环结构的基本句式是
while exp: do something else: do something
先判断exp表达式的结果是否为真,如果为真,执行一次下面缩进的代码块,
然后再回到exp表达式进行计算,如果结果为真,就再执行一次下面缩进的代码块,
直到某一次exp表达式计算结果不为真,如果有else分支,就先执行else分支下面的语句,再执行while语句后面的代码
如果没有else分支,就直接 while语句后面的代码
循环中的else语句同样是可有可无的
另外,循环语句的缩进代码块中,可以使用break语句,直接跳出循环,甚至不进行判断,不执行else分支,直接执行while语句后面的代码
while True: print("执行break语句") break else: print("break 后不会执行这里") print("break后会直接跳到这里来执行")
循环语句的缩进代码块中,可也以使用continue语句,直接跳过continue后面的语句,进行exp表达式的判断
num = 1 while num < 100: num = num + 1 # 判断是否能被2整除,如果是偶数,就直接跳下一次循环 if num % 2 == 0: continue print("如果", num, "是偶数", "就不会执行到这里")
做几个练习加深一下理解
练习一 输出1~100以内所有整数的和
sum = 0 i = 1 while i <= 100: sum = sum + i i = i + 1 print(sum)
练习二 输出1~100之间的奇数
i = 1 while i<=100: if i % 2 != 0 : print(i) i = i + 1
练习三 输出1~100 之间所有偶数的和
sum = 0 i = 1 while i <=100: if i%2== 0: sum += i # sum = sum + i i += 1 print(sum)
练习四 输出1-2+3-4+5.. 100的和

i = 1 sum = 0 while i <= 100: if i % 2 == 1: sum = sum + i else: sum = sum - i i += 1 print(sum)
练习五 输入用户名密码,假设用户名为zhangsan 密码为123456,如果用户名密码匹配,输出成功,
如果密码输入错了,提示重新输入,连续输错三次用户名和密码就退出登陆,提示登陆失败

count = 1 while True: username = input("请输入用户名:") passowrd = input("请输入密码:") if username == 'zhangsan' and passowrd == '123456': print("登陆成功!") break elif count == 3: print("登陆失败!") break else: print("用户名或密码错误,请重新输入") count = count + 1
练习六 求斐波那契数列中小于1000的数, 斐波那契数列定义, 第一个数是0,第二个数是1,从第三位开始,每一个数字是前两个数字的和
如0,1,1,2,3,5,8 ...

a, b = 0, 1 while a < 1000: print(a, end=',') a, b = b, a+b
1.5.5 空语句
当我们想在一个代码块中什么都不执行时,可以用pass来代替,pass表示一个空语句 ,什么都不执行
if score == 60: pass else: print("不及格")