第二章:编程入门
第一节:关于Python
Python的诞生
1990年由新西兰人Guido van Rossum所创建,起名源于英国戏剧“Monty Python’s flying circus”;
主要版本有Python2和Python3,后者并不兼容前者,一些主流的框架已放弃对Python2的支持;
Python的特点
- 简洁优美,易于学习,因此受到热捧,并且广泛被作为编程的入门语言使用;
- 胶水语言,由于其简洁的特性和受追捧的程度,C和Java都为其提供了大量的类库支持,使得一个以Python为主要编程语言的工程,可以引入和调用大量C以及Java的类库,因此Python被称为是“胶水语言”;
- 面向对象,Python是面向对象的语言;
- 脚本语言,Python是一门脚本语言,由Python解释器逐行解释并执行;
有哪些运用领域?
- Web开发;
- 爬虫程序开发;
- 数据挖掘;
- 机器学习(人工智能);
- 少儿编程;
由于有C类库的支持,理论上Python是可以做任何事情的
第二节:Python的开发环境
下载和安装Python解释器
官方解释器下载地址:https://www.python.org/downloads/windows/
使用Python首先我们要接触Python的解释器,这里我们选择一个Python3的版本进行安装,Python2已经逐渐过时,这里不做讨论;
按照流程进行安装,安装过程中注意勾选【将python解释器路径添加到系统环境变量的选项】(也可以安装完成后手动将python.exe所在的路径);
在cmd命令行中进行编程
如在正常成功安装了,那么可以在任意位置打开命令行,执行python命令,即输入Python
,即可进入python编程环境;
输入代码print("hello world!")
,可以发现命令行立即进行了输出;
使用解释器解释并执行HelloWorld程序
- 在桌面建立hello.py文件,代码如下:
import time
print("hello world!")
time.sleep(3)
print("hello china!")
- 在桌面shift+右键,打开cmd命令窗口,执行命令:
python hello.py
,就会神奇地发现,命令窗口输出“hello world!”,3秒后再输出”hello china!”
下载和安装集成开发环境PyCharm
- PyCharm是目前最流行的Python集成开发环境;
- 官方下载地址:http://www.jetbrains.com/pycharm/download/previous.html
- 按照流程指引进行安装;
- 安装完后,配置Python解释器位置;
在PyCharm中运行HelloWorld程序
刚才我们试过了运用CMD执行了HelloWorld程序,那么现在尝试使用Pycham执行HelloWorld程序
- 创建Pure Python工程,指定名称;
- 在工程中按需创建子目录并新建Python代码文件"HelloWorld.py"
- 插入代码
import time
print("Hello PyCharm!")
time.sleep(3)
print("Hello IDE!")
- 右键执行run HelloWorld;
- 执行结果如图
第三节:Python的基础程序设计
标识符
标识符的要点:
-
标识符是用来对常量、变量、方法、类、模块进行命名的字符;
-
标识符可以是大小写字母、数字、下划线;
-
命名不能以数字开头;
-
区分大小写;
-
命名风格可以是:
√ 驼峰风格
√ 小写字母+下划线风格例如:
# 小写字母+下划线风格的变量定义
the_radius_1 = 10
# 驼峰风格的变量定义
theRadius2 = 10
# 小写字母+下划线风格的方法定义
def get_circle_area_1(r):
return 3.14 * r * r
# 驼峰风格的方法定义
def getCircleArea2(r):
return 3.14 * r * r
常量、变量、表达式
- 常量的值不会发生变化,比如圆周率;
- 变量是值可以动态变化的量;
- 表达式是对常量和变量进行数学或逻辑运算的式子;
- 在Python中,我们可以使用一条语句给多个变量赋值;
# 定义常量,一般是全大写
PI = 3.14
# 定义变量,其值是可以动态改变的
radius = 10
# 使用表达式为变量area赋值
area = PI * radius * radius
print("半径变量改变前圆的面积是", area)
# 变量的值是可以动态改变的
radius = 20
area = PI * radius * radius
print("半径变量改变后圆的面积是", area)
# 同时给多个变量赋值
name, age = "Pythoner", 18
print(name, age)
执行结果:
基本数据类型
Python基本数据类型有如下7种:
- int —— 整型;
- float —— 浮点型;
- complex —— 复数类型;
- bool —— 布尔类型,取值可以是True或False,分别等于整型的1和0;
- str —— 字符串类型;
- 对象型 —— 类的实例;
- None —— NoneType类型
# 整型
intVar = 12
print(type(intVar))
# 浮点型
floatVar = 12.0
print(type(floatVar))
# 复数类型
complexVar = 12 + 34j
print(type(complexVar))
# 布尔类型
boolVar = True
print(type(boolVar))
# 字符串类型
strVar = "人生苦短,请用Python"
print(type(strVar))
# 对象类型
objVar = Canvas()
print(type(objVar))
# 空类型
noneVar = None
print(type(noneVar))
代码执行结果:
复数
- 复数表示
√ 基本表示:1 + 2j 或 complex(1,2),其中1为实部,2j为虚部;
√ 几何表达:
a + bj相当于直角坐标系中的(a,b)
用于表示复数的平面称为【复数平面】
√ 实数与虚数
实数:虚部为0的复数
虚数:虚部不为0的复数
纯虚数:实部为0而虚部不为0的复数
- 运算公式
√ (a+bi)+(c+di)=(a+c)+(b+d)i
√ (a+bi)-(c+di)=(a-c)+(b-d)i
√ (a+bi)*(c+di)=(ac-bd)+(ad+bc)i
√ (a+bi)/(c+di)=(a+bi)(c-di)/(c2+d2)
√ |a+bi|=(a2+b2)^0.5
- 复数的意义
√ 实数成为复数的子集,拓展了数的范围;
√ 平面几何(坐标)的代数表达;
√ 在各种物理和科学计算中应用广泛;
比如:
# 复数的两种定义形式
a = 1 + 2j
b = complex(3, 4)
# 复数的计算
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(abs(a))
执行结果:
注释与引号
前言:
为什么要有注释?注释是一段代码或一行代码的解释说明,便于可读性,理解性、执行性、必要性
- 单行注释与多行注释
单行注释通常在说明前用#
表示,并且不会出现在代码执行结果中,不会对代码产生影响 ,
多行注释通常在一段代码的前、后使用'''
表示,意为中间的多行,不会出现在代码执行结果中,仅做注释用
#我是单行注释
'''
我是多行注释
我是多行注释
我是多行注释
重要的事情说多几遍
'''
- 单引号、双引号、三引号的区别
例 如:
sentence = '我是单引号,单独使用时,我跟双引号没什么区别'
print(sentence)
sentence = "我是双引号,单独使用时,我跟单引号没什么区别"
print(sentence)
# 单引号内只能嵌套双引号
sentence = "*说过:'一切反动派都是纸老虎'"
print(sentence)
# 双引号内只能嵌套单引号
sentence = '*说过:"黑猫白猫,能抓住老鼠就是好猫"'
print(sentence)
# 三引号的格式在打印时会被保留
sentence = '''
一首好诗
大海啊你全他妈是水,
蜘蛛啊你全他妈是腿,
辣椒啊真他妈辣嘴,
不学Python啊真他妈后悔。
——亚洲气质舞王 尼古拉斯·赵四
'''
print(sentence)
执行结果:
程序错误
程序错误通常分为3类:
- 语法错误,——无法被解释器解释,比如引号没有成对出现;
# 语法错误在IDE中会立刻报红色不能执行结果,
print("不小必少了右边的引号)
语法错误在IDE中会立刻报红,在普通文本编辑工具中则难以发现,但解释器无法对其进行解释;
- 运行时错误,——语法正确,但解释时会报错,运行时错误又称为异常,常见的如零分母异常,类型异常等
# 这里会报一个零分母异常,因为零不能做除数
print(5/0)
执行结果:
# 这里会报一个类型异常,因为字符串是无法与浮点数进行计算的
a = "3"
print(a*3.14)
- 逻辑错误,——语法上没有错,也没有运行时异常,不会报错,纯粹只是业务逻辑不正确
# 这里是一个逻辑错误
radius = 10
area = 3.14 + radius
print("以10为半径的圆的面积是",area)
转义字符、占位符
-
转义字符
-
占位符
整型占位符:%d
;
浮点型占位符:%f
;
字符串占位符:%s
;
空白占位符:{}
,可以填充任意类型的数值;
序号占位符:{具体序号}
,参数列表会按序号的位置进行一一对应;
# 使用具体类型占位符
print("我的名字是%s,今年%d岁了,我的银行账户余额为%f"%("比尔",50,1234567890.123))
# 使用空白占位符
print("我的名字是{},今年{}岁了,我的银行账户余额为{}".format("比尔",50,1234567890.123))
# 使用序号占位符,这里注意,3个参数会依次对应到0、1、2的位置上
# 0号位置应填余额,1号位置应填年龄,2号位置应填姓名,因此正确的参数顺序为(1234567890.123,50,"比尔")
print("我的名字是{2},今年{1}岁了,我的银行账户余额为{0}".format(1234567890.123,50,"比尔"))
执行结果:
- 更多占位符
数学运算
- 加减乘除
print(2 + 3)
print(2 - 3)
print(2 * 3)
print(2 / 3)
- 整除、求余
print(10 // 4) # 整除
print(10 % 4) # 求余
- 求绝对值、最大、最小值
print(abs(-5)) # 【内建函数】abs()
print(math.fabs(-5)) # 通过math模块的fabs()求绝对值,带小数
print(max(12, 34, -56, 0))
print(min(12, 34, -56, 0))
- 四舍五入
print(round(3.4)) # 3
print(round(3.5)) # 4
# 负数按绝对值大小四舍五入
print(round(-3.4)) # -3
print(round(-3.5)) # -4
print(math.floor(3.9)) # 3
print(math.ceil(3.1)) # 4
- 角度的正弦、余弦、正切
print(math.sin(math.pi / 6))
print(math.cos(math.pi / 6))
print(math.tan(math.pi / 6))
- 角度、弧度互转
print(math.radians(30)) # 角度转弧度
print(math.degrees(math.pi / 6)) # 弧度转角度
- 乘方和开方
print(2 ** 3) # 2的3次幂
print(pow(2, 3)) # 2的3次幂
print(math.pow(2, 3)) # 2的3次幂,精度较高
print(math.sqrt(9)) # 9的开方
print(8 ** (1 / 3)) # 8开3次方,将开方转化为乘方
- 求对数
print(math.log(8, 2))
print(math.log(math.e ** 2)) # 默认底数为e
- 科学计数法
1.23E2或1.23E+2=1.23*10^2
1.23E-2=1.23*10^-2
- 自增强
temp = 5
temp += 3 # 自加3,等价于:temp = temp+3
temp -= 3
temp *= 3
temp /= 3
temp //= 3
temp %= 3
temp **= 3
print(temp)
**PS:**算术运算符的优先级:(括幂乘加法则)
括号最高
幂(乘方,指数)
乘除(包括整除和求余)
加减
用input
接收用户输入
-
接收用户输入的单个值
需要注意的是,用户输入的任何值,都会被视为一个
字符串
;
如果要参与数学计算,务必要先将其类型转换为数值型;
radius = input("请输入您的头的半径:") # input函数接收的任何输入均为字符串类型
print("您的头的半径为", radius)
# area = 3.14 * radius * radius #类型错误
print("radius的类型为:", type(radius)) # 字符串类型(str),而非数值类型
# 只有数值类型才能进行数学计算
radiusStr = input("请输入您的头的半径:")
# 将字符串转化为数值,重新赋值给radius
radius = eval(radiusStr)
print("radius的类型为:", type(radius)) # 整数类型(int)
# 计算结果
area = 3.14 * radius * radius
print("您的脸有:", area, "那么大")
执行结果:
-
一次性接收用户输入的多个值
用户在输入时,值之间需要使用英文逗号’
,
'进行分隔;
input方法外部必须使用eval方法包裹,否则用户输入的数据只会被视为一个普通字符串;
# 注意使用eval方法将多个值进行转化
width, height = eval(input("请输入矩形宽高:"))
print("width的类型为", type(width), "width=", width)
print("height的类型为", type(height), "height=", height)
print("矩形的面积为:", width * height, "平米")
# 注意使用eval方法将多个值进行转化
a, b, c = eval(input("请输入三个值:"))
iMax = max(a, b, c)
iMin = min(a, b, c)
print("最大的值为:", iMax, "最小值为:", iMin)
执行结果:
多样化的输出
- 精确保留小数位数
print("9876543210")
#format,表示格式化的意思,10.2f表示指定10宽度,2精度的格式化
print(format(3.1415926, ".2f"))
print(format(3.1415926, "10.2f"))
- 以百分号和科学计数法输出
print(format(9876543210, "10.2e")) # 用科学计数法表示
print(format(0.0000000123456789, "10.2e")) # 用科学计数法表示
print(format(0.56789, "10.2%"))
- 左右对齐输出
print(format(12.34567, "<20.2f"))
print(format(1234567890.12345, "<20.2f"))
print(format(12.34567, ">20.2f"))
print(format(1234567890.12345, ">20.2f"))
- 以不同进制进行输出
print(format(12345,"20b"))
print(format(12345,"20o"))
print(format(12345,"20d"))
print(format(12345,"20x"))
- 定义字符串的输出长度和对其方式
print(format("Hello","10s"))
print(format("Python","10s"))
print(format("Hello",">10s"))
print(format("Python",">10s"))
- 定义输出的结束符
print("悔创阿里杰克马",end='\t')
print("一无所有王健林",end='\t')
print("不识妻美刘强东",end='\t')
print("普通家庭马化腾",end='\n')
- 定义多个输出的分隔符
print("悔创阿里杰克马","一无所有王健林",sep=' & ',end=";")
print("不识妻美刘强东","普通家庭马化腾",sep=' & ')
- 输出格式化的文本
print('''
一首好诗
大海啊你全他妈是水,
蜘蛛啊你全他妈是腿,
辣椒啊真他妈辣嘴,
不学Python啊真他妈后悔。
——亚洲气质舞王 尼古拉斯·赵四
''')
- 输出引号本身
print("*说过:'一切反动派都是纸老虎'")
print('*说过:"黑猫白猫,能抓住老鼠就是好猫"')
print("赵四说过:\"这世上没有什么事情是一顿烧烤所不能解决的,如果有,那就两顿\"")
系统内建函数
内建函数的使用,不需要引入模块,直接调用;所有的内建函数存在于系统标准库模块builtin.py中;系统内建函数有很多,这里列举一些常用的
- id() —— 获取目标的内存地址
a = 10
arg1 = 4
arg2 = 6
b = arg1 + arg2
print("a/b", id(a), id(b))
print("两个变量指向相同的数值存储地址\n")
s = "helloworld"
arg1 = "hello"
arg2 = "world"
news = arg1 + arg2
print("s/news", id(s), id(news))
print("字符串拼接结果使用新的地址进行存储\n")
arg1 = 5
print("arg1", id(arg1))
arg1 = 6
print("arg1", id(arg1))
print("同一变量先后指向不同的内存地址")
def sayHello():
print("hello")
print("函数地址", id(sayHello))
- format() —— 格式化函数
# 参数1=要格式化的目标,参数2=格式
s = format(123.456, ".2f")
print(s, type(s)) # 123.46 <class 'str'>
- 数学计算函数
比如:
求最大值:max()
求最小值:min()
求绝对值:abs()
求幂:pow()
四舍五入:round()
print(max(1, 2))
print(min(1, 2))
print(abs(-1.2))
print(pow(2, 3)) # 8
print(round(-4.6)) # -5
- 类型与转换函数
获取目标的数据类型:type()
取整或字符串转整型:int()
数值转字符串:str()
转换用户的输入为非字符串:eval()
print(type("hello")) # <class 'str'>
print(int("123"), int(123.45)) # 123 123
print(str(123.45), type(str(123.45))) # 123.45 <class 'str'>
print(eval("1,2,3"), type(eval("1,2,3"))) # (1, 2, 3) <class 'tuple'>
- 输入输出函数
输入函数:input()
输出函数:print()
第四节:字符集
什么是字符集
计算机记录文本的方式是通过字符集序号来记录的;
每一个字符的存储,都是以其位于字符集中的序号来实现的,包括空格、换行符、标点等;
最早的字符集是ASCII
,只包含包括大小写字母、阿拉伯数字、一些基本符号;
随着计算机在全球各国的普及,由于世界的语言众多,就诞生了各种适应不同语种的字符集;
专门适应中文的字符集有GBK、GB2312等,例如Windows操作系统中文版所使用的就是GBK字符集;
但无论何种字符集,都默认将ASCII完整包含在前128位当中;
由于不同主机中使用的字符集不同,导致了严重的数据传输乱码问题;
UTF-8字符集包含了世界各种不同语言中的常用字符,正逐渐成为某种意义上的、心照不宣的业界标准;
ASCII字符集
美国标准信息交换码(American Standard Code for Information Interchange);
包括最基本的128个字符,是最早也最基本的字符集;
内容包括大小写字母、阿拉伯数字、以及一些常用符号;
序号和字符的互换可以使用chr(order)和ord(character)两个系统内建函数;
ASCII码表
第五节:Python标准库使用案例
使用turtle绘制奥林匹克五环
- turtle模块常用API
showturtle() —— 显示窗口
penup()/pendown() —— 提起/落下画笔
left(90)/right(90) —— 向左转/向右转,参数为角度
goto(x,y) —— 移动画笔到指定位置
forward(100) —— 前行指定距离
color(“black”) —— 设置画笔颜色
pensize(10) —— 设置字体大小
write(“Hello”) —— 写字
circle(50) —— 绘制指定半径的圆环
done() —— 开启消息循环,使窗口保留,程序不自动退出
- 完整代码
#导入turtle
import turtle
# 设置画笔
turtle.showturtle()
turtle.pensize(5)
# 蘸颜料,提起画笔,移动至指定位置,落笔,绘制蓝色圆环
turtle.color("blue")
turtle.penup()
turtle.goto(-110,0)
turtle.pendown()
turtle.circle(45)
# 蘸颜料,提起画笔,移动至指定位置,落笔,绘制黑色圆环
turtle.color("black")
turtle.penup()
turtle.goto(0,0)
turtle.pendown()
turtle.circle(45)
# 蘸颜料,提起画笔,移动至指定位置,落笔,绘制红色圆环
turtle.color("red")
turtle.penup()
turtle.goto(110,0)
turtle.pendown()
turtle.circle(45)
# 蘸颜料,提起画笔,移动至指定位置,落笔,绘制黄色圆环
turtle.color("yellow")
turtle.penup()
turtle.goto(-55,-45)
turtle.pendown()
turtle.circle(45)
# 蘸颜料,提起画笔,移动至指定位置,落笔,绘制绿色圆环
turtle.color("green")
turtle.penup()
turtle.goto(55,-45)
turtle.pendown()
turtle.circle(45)
# 蘸颜料,提起画笔,移动至指定位置,落笔,书写口号
turtle.color("black")
turtle.penup()
turtle.goto(-110,-80)
turtle.pendown()
turtle.write("同一个世界,同一个梦想",font=("华文行楷", 15, "italic"))
#程序本该结束,但保持窗口的消息循环,使程序保持运行,直到用户手动终止
turtle.done()
执行结果: