目录
一、库的引入
# 蟒蛇绘制实例
import turtle
turtle.setup(650, 350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
1、导入函数库的方法
- 格式1: import <库名> 例如:import turtle
调用格式: <库名>.<函数名> 例: turtle.fd(100)
- 格式2: from <库名> import <函数名>
或 from <库名> import *
调用函数不需要<库名>,直接使用<函数名> , 如:
from turtle import *
fd(100)
- 格式3: import <库名> as <别名> 例如:import turtle as tu
内置标准库:
库名 作用 math 数学运算 os 用来处理文件和目录 re 正则表达式 random 用于生成随机数 time 时间模块 datetime 日期和时间处理 sys 提供一系列有关Python运行环境的变量和函数 ······ ······
二、 数值类型
Python语言包括三种数字类型:int、float、complex
1、整数 - int
- 与数学中的整数概念一致,如1001、-250、0x9a、0x89
- 理论上没有取值范围限制
- 整数类型共有4种进制表示:十进制、二进制、八进制和十六进制,默认情况下,整数采用十进制。
进制种类 | 引导符号 | 描述 |
十进制 | 无 | 默认情况,如1001、-250 |
二进制 | 0b 或 0B | 由字符0和1组成,如0b101、0B101 |
八进制 | 0o 或 0O | 由字符0到7组成,如0o711、0O711 |
十六进制 | 0x 或 0X | 由字符0和9、a到f、A到F组成,如0xABC |
2、浮点型 - float
- 带有小数点及小数的数字;数值范围存在限制,小数精度也存在限制
- 浮点数最长可输出16个数字(计算机只能提供15个数字的准确性,最后一位由计算机根据二进制计算结果确定,存在误差)
- 浮点数有两种表示方法:十进制表示和科学计数法,如:
0.0,-77.,-2.17,96e4,4.3e-3,9.6E5
科学计数法使用字母e或E作为幂的符号,以10为基数,如9.6E5也可表示为9.6E+5,其值为960000.0
拓展用法:标准库decimal
3、复数型 - complex
- 与数学中的复数概念一致, z = a + bj, a是实数部分,b是虚数部分,a和b都是浮点类型,虚数部分用j或者J标识
- 可以用z.real和z.imag分别获得它的实数部分和虚数部分
4、数值类型的关系
- 三种类型可以相互转换
函数:int(),float(),complex()
- type(x),返回x的类型,适用于所有类型的判断
5、数值类型的操作
(1)数值运算
- max()、min()、sum()、round()、
(2)内置函数:不用引入库,可直接使用的函数,
详见 https://www.runoob.com/python/python-built-in-functions.html
常用函数:
- input()、raw_input()、eval()、print()
- int()、float()、str()、type()
- len()、min()、max()、sum()、sorted()、range()、round()
三、math库
- math库是Python提供的内置数学类函数库
- math库不支持复数类型,提供了4个数学常数和44个函数(4类)
1、两种导入方式
2、常用函数
函数 | 数学表示 | 描述 |
math.fsum([x,y,....]) | x+y+ ··· | 浮点数精确求和 |
math.fabs(x) | |x| | x的绝对值 |
math.fmod(x,y) | x%y | x与y的模 |
math.ceil(x) | ![]() | 向上取整,返回不小于x的最小整数 |
math.floor(x) | ![]() | 向下取整,返回不大于x的最大整数 |
math.trunc(x) | 返回x的整数部分 | |
math.pow(x,y) | ![]() | x的y次幂 |
3、其它函数
- 四个数学常数
- 16个数值表示函数
-
8个幂对数函数
-
16个三角对数函数
- 4个高等特殊函数
四、应用案例
应用描述:一年365天,以第1天的能力值为基数,记为1.0,当好好学习时能力值相比前一天提高1‰,当没有学习时由于遗忘等原因能力值相比前一天下降1‰。每天努力和每天放任,一年下来的能力值相差多少呢?
import math
dayup = math.pow((1.0 + 0.001), 365) # 每天提高0.001
daydown = math.pow((1.0 - 0.001), 365) # 每天荒废0.001
print("向上: %.2f, 向下: %.2f."%(dayup, daydown))
运行结果:
- 条件变化: 工作5天,休息2天
-
dayup, dayfactor = 1.0, 0.01 for i in range(365): if i % 7 not in [6, 0]: dayup = dayup * (1 + dayfactor) else: dayup = dayup * (1 - dayfactor) print("向上5 天向下2 天的力量: {:.2f}.".format(dayup))
运行结果:
五、字符串
1、字符串类型及其操作
(1) 字符串类型的表示
- 单行 - 单引号(' ')或双引号(" ")
- 多行 - 三引号(''' '''或 """ """)
- 开始符、结束符为同一种定界符,成对组成;
(2) 字符与ASCII之间的转换
- ord(char) ----得到整数
- chr(int) ----得到字符
(3) 索引
字符串的下标索引从0开始,之后一个字符的索引为-1
(4) 切片(截取)
—通过两个索引值,访问序列中某一范围的元素
格式:序列名[start : end]
- 遵照”算头不算尾”原则;
- 省略start,默认从头开始;省略,默认到结尾处
还可以增加”步长值”,省略,默认为1
(5) 加法与乘法
- 加法:实现字符串连接功能【字符串只能和字符串相加,数字只能和数字相加】
- 乘法:产生新字符串,内容是原字符串内容重复多次
(6) 成员资格
- 运算符:in 或not in
- 返回值:布尔值
(7) 长度 len()、最大值max()、最小值min()
2、字符串的常用方法
方法 | 描述 |
str.find(sub [,start [,end]]) | 检测 sub子串 是否包含在字符串str中,如果指定范围 start 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1 |
str.rfind(sub [,start [,end]]) | 类似于 find()函数,不过是从右边开始查找 |
str.count(sub [,start [,end]]) | 返回 str[start, end] 在 sub子串出现的次数 |
str.replace(old,new[,count]) | 返回字符串str的副本,所有old子串被替换为new,,若count给出,则替换不超过count次 |
str.split(sep=None,maxsplit=-1) | 返回一个列表,以 seq 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串 |
str.join(seq) | 以指定字符串str作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
str.lower() | 转换字符串中所有大写字符为小写. |
str.upper() | 转换字符串中所有小写字符为大写. |
str.maketrans() | 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 |
str.translate(table, deletechars="") | 根据 str 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中 |
str.strip([chars]) | 在其左侧和右侧去掉chars中列出的字符 |
str.zfill(width) | 返回长度为 width 的字符串,不足之处在左侧填充0 |
str.startswith(prefix [,start [,end]]) | 检查字符串是否是以指定子字符串 prefix 开头,是则返回 True,否则返回 False。如果start 和 end 指定值,则在指定范围内检查。 |
str.endswith(suffix [,start [,end]]) | 检查字符串是否以 suffix 结束,如果start 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. |
str.isalnum() | 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False |
str.isalpha() | 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False |
str.isdigit() | 如果字符串只包含数字则返回 True 否则返回 False |
rjust(width,[, fillchar]) | 返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串 |
返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。 |
2.1 常用方法
- 查找与替换(find 、count & replace)
str.find(sub [,start [,end]])
>>> str = 'This is my book'
>>> str.find('is') # 从下标0开始,查找在字符串里第一个出现的子串
2
>>> str.find('is', 3) # 从下标3开始,查找在字符串里第一个出现的子串
5
>>> str.find('os') # 查找不到返回-1
-1
>>> str.rfind('is') # rfind 与 find 类似,只是从右往左找
5
str.count(sub [,start [,end]])
>>> str = 'this is string example'
>>> str.count('i')
3
>>> str.count('is', 5, 10) # 返回 is在str[5, 10]中出现的次数
1
>>> str.count('is')
2
str.replace(old,new[,count])
>>> str = 'this is string example!!! this is really string'
>>> str.replace('is', 'was')
'thwas was string example!!! thwas was really string'
>>> str.replace('is', 'was', 2) # 最多替换2个
'thwas was string example!!! this is really string'
- 分割与连接(split & join)
str.split(sep=None,maxsplit=-1)
>>> str = 'this is string example,this is really string'
>>> str.split( )
['this', 'is', 'string', 'example,this', 'is', 'really', 'string']
>>> str.split('i', 1) # 只以第一个i作为分隔符
['th', 's is string example,this is really string']
>>> str.split(',')
['this is string example', 'this is really string']
str.join(seq),seq为序列
>>> '-'.join(('a','b','c'))
'a-b-c'
>>> ' union all '.join(['select * from emp','select * from emp1'])
'select * from emp union all select * from emp1'
- 大小写转换(lower & upper)
str.upper()、 str.lower()
>>> str = 'this is string example'
>>> str.upper()
'THIS IS STRING EXAMPLE'
>>> str = 'THIS IS STRING EXAMPLE'
>>> str.lower()
'this is string example'
- 映射与转换(maketrans & translate)
- 删除与填充(strip & zfill)
str.strip([chars])、
str.lstrip([chars])、str.rstrip([chars])
>>> str = ' this is string example '
>>> str.strip()
'this is string example'
>>> str = 'xxxthis is string example!xxx'
>>> str.strip('x')
'this is string example!'
>>> str.lstrip('x')
'this is string example!xxx'
>>> str.rstrip('x')
'xxxthis is string example!'
str.zfill(width)
>>> str = 'this is string example'
>>> len(str)
22
>>> str.zfill(30)
'00000000this is string example'
- 开始与结束(startswith & endswith)
str.startswith(prefix [,start [,end]])
>>> str = 'this is string example'
>>> str.startswith('this')
True
>>> str.startswith('string', 8)
True
>>> str.startswith('this', 2, 4)
False
str.endswith(suffix [,start [,end]])
>>> str = 'this is string example!'
>>> str.endswith('!')
True
>>> str.endswith('!',0,10)
False
>>> str.endswith('e')
False
- 类型判断(isalnum、isalpha & isdigit)
>>> str = 'this is string example!' # 包含空格
>>> str.isalnum() # 判断字符串是否只包含数字或字母或中文
False
>>> str.isalpha() # 判断字符串是否只包含字母或中文
False
>>> str.isdigit() # 判断字符串是否只包含数字
False
>>> str = 'this'
>>> str.isalpha()
True
>>> str = 'this67'
>>> str.isalpha()
False
>>> str.isdigit()
False
>>> str.isalnum()
True
>>> str = 'this'
>>> str.isalnum()
True
>>> str = 'this这是'
>>> str.isalnum()
True
>>> str.isalpha()
True
>>> str = '7658'
>>> str.isalpha()
False
>>> str.isdigit()
True
>>> str.isalnum()
True
- 使用指定的字符填充(ljust / rjust)
>>> str = 'this is string example!'
>>> str.ljust(30, '*') # 左对齐
'this is string example!*******'
>>> str.rjust(30, '*') # 右对齐
'*******this is string example!'
(2)打印时使换行符\n可见
- repr(str)
In [67]: str='''er
...: kkii'''
In [68]: repr(str)
Out[68]: "'er\\nkkii'"
3、字符串类型的格式化
有两种方式
(1)%
>>> pi = 3.14159
>>> print('pi = ', pi)
pi = 3.14159
>>>
>>> a =10
>>> b =20
>>> print('%4d + %4d = %4d'%(a,b,a+b))
10 + 20 = 30
>>> print('%4d + %4d = %.2f'%(a,b,a+b))
10 + 20 = 30.00
(2)str.format() (推荐使用)
格式: <模板字符串>.format(<逗号分隔的参数>)
- 说明: format()方法中模板字符串的槽除了包括参数序号,还可以包括格式控制信息。此时,槽的内部样式如下: {<参数序号>: <格式控制标记>}
- 其中,格式控制标记用来控制参数显示时的格式 。 格式控制标记包括: <填充><对齐><宽度>,<.精度><类型>6个字段,这些字段都是可选的,可以组合使用,这里按照使用方式逐一介绍。
4、文本进度条
小技巧: import time库,使用sleep()、clock()等
(1)简单的文本进度条
import time
scale = 20
print('------执行开始------')
for i in range(scale+1):
a, b = '**'*i, '··'*(scale-i)
c = (i/scale)*100
print('{:^3.0f}%[{}->{}]'.format(c,a,b))
time.sleep(0.1)
print('------执行结束------')
运行结果:
(2)单行动态刷新的文本进度条
与上例区别: 原地输出、动态刷新
import time
for i in range(101):
print("\r{:2}%".format(i), end="")
time.sleep(0.05)
(3)带刷新的文本进度条
import time
scale = 50
print("执行开始".center(scale//2,'-'))
t = time.clock()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
t -= time.clock()
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
time.sleep(0.05)
print("\n"+"执行结束".center(scale//2,'-'))
(4)关于进度条的拓展
结论: 可容忍开始时的慢速,不能容忍结束时的慢速
六、时间转换
日期和时间的一些常用处理方法,主要是在 time 和 datetime 这两个模块
1、time模块
- time模块下有3种时间格式:时间戳(sesc)、时间元组(tupletime)、格式化字符串时间
- 其所能表述的日期范围被限定在 1970 - 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用datetime模块更好。
(1) 获取当前时间
import time
# 获取当前时间的时间戳
ts = time.time()
print(ts)
# 运行结果:1610175653.113144
# 获取当前时间的时间元组
t = time.localtime()
print(t)
# 运行结果
# time.struct_time(tm_year=2021, tm_mon=1, tm_mday=9, tm_hour=15, tm_min=1, tm_sec=23, tm_wday=5, tm_yday=9, tm_isdst=0)
- localtime() 输出结果为用一个元组装起来的9组数字处理时间
序号 | 属性 | 字段含义 | 值 |
---|---|---|---|
0 | tm_year | 四位数的年 | 2021 |
1 | tm_mon | 月 | 1 到 12 |
2 | tm_mday | 日 | 1 到 31 |
3 | tm_hour | 小时 | 0 到 23 |
4 | tm_min | 分钟 | 0 到 59 |
5 | tm_sec | 秒 | 0 到 61 (60或61 是闰秒) |
6 | tm_wday | 一周的第几日 | 0到6 (0是周一) |
7 | tm_yday | 一年的第几日 | 一年中的第几天,1 到 366 |
8 | tm_isdst | 夏令时 | 是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1 |
(2)时间转换及格式化
import time
tupletime = time.localtime()
# 1)时间元组 —> 字符串,格式如 Sun Jan 10 11:07:53 2021
# time.asctime([tupletime]),接收时间元组,未给参数默认转换当前时间元组
print('time.asctime(tupletime):{}'.format(time.asctime(tupletime)))
# 2)时间戳 —> 字符串,格式如 Sun Jan 10 11:07:53 2021
# time.ctime([secs]),未给参数默认转换当前时间戳
print('time.ctime(secs):{}'.format(time.ctime(1610250145.3070025)))
print('time.ctime():{}'.format(time.ctime()))
# 3)时间戳 —> 时间元组
# time.gmtime([secs]),默认转换当前时间戳
print('time.gmtime():{}'.format(time.gmtime()))
print('time.gmtime(secs):{}'.format(time.gmtime(1610250145.3070025)))
# 4)时间元组 —> 时间戳
# time.mktime(tupletime)
t1 = time.localtime()
print('time.mktime(tupletime):{}'.format(time.mktime(t1)))
# 5)指定fmt格式的时间字符串 —> 时间元组
# time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
print('time.strptime():{}'.format(time.strptime('2021-1-10 12:14:50', '%Y-%m-%d %H:%M:%S')))
# 6)时间元组 —> 指定fmt格式的时间字符串
# time.strftime(fmt[,tupletime])
print('time.strftime():{}'.format(time.strftime('%Y-%m-%d %H:%M:%S', tupletime)))
运行结果:
python中时间日期格式化符号:
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00=59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
- %j 年内的一天(001-366)
- %p 本地A.M.或P.M.的等价符
- %U 一年中的星期数(00-53)星期天为星期的开始
- %w 星期(0-6),星期天为星期的开始
- %W 一年中的星期数(00-53)星期一为星期的开始
- %x 本地相应的日期表示
- %X 本地相应的时间表示
- %Z 当前时区的名称
- %% %号本身
时间类型转换图示:
2、datetime模块
datetime库可以从系统中获得时间,并以用户选择的格式输出。
基于 time 进行了封装,提供了更多实用的函数。在datetime 模块中包含了几个类,具体如下:
类 | 描述 |
datetime | 同时有时间和日期 |
timedelta | 主要用于计算时间跨度 |
tzinfo | 时区相关 |
time | 只关注时间 |
date | 只关注日期 |
由于datetime.datetime类表达形式最为丰富,这里主要介绍这个类的使用。
datetime类中有3种时间类型:datetime、时间戳、格式化字符串
from datetime import datetime
# 1)获取当前日期和时间,精确到微秒
now = datetime.now()
print(now) # 2021-01-10 14:43:50.501211
# 2)构建一个指定日期和时间的datetime对象
# datetime(year, month, day, hour, minute, second, microsecond)
# 其中,hour, minute, second, microsecond参数可以全部或部分省略
today = datetime(2021, 1, 11, 10, 30, 10, 7)
print(today) # 2021-01-11 10:30:10.000007
print(today.year)
print(today.hour)
# 3)datetime类型 —> 字符串
now_d = datetime.now()
dts = now_d.strftime('%Y-%m-%d %H:%M:%S')
print(dts, type(dts)) # 2021-01-10 16:07:29
# 扩展:上述格式化符号可以与print的格式化函数一起使用
print('今天是{0:%Y}年{0:%m}月{0:%d}日'.format(now_d))
## 今天是2021年01月10日
# 4)字符串 —> datetime类型
std = datetime.strptime(dts, '%Y-%m-%d %H:%M:%S')
print(std, type(std)) # 2021-01-10 16:07:29
# 5)datetime类型 —> 时间戳
timestamp = std.timestamp()
print(timestamp) # 1610266049.0
# 6)时间戳 —> datetime类型
ttd = datetime.fromtimestamp(1610250145.3070025)
print(ttd) # 2021-01-10 11:42:25.307003
3、应用
平时在使用pycharm等编辑器时是没有显示耗时的,如果想知道写的程序跑了多长时间,可以通过time模块和datetime获取
(1)time.perf_counter()
import time
start = time.perf_counter() # 返回系统运行时间
time.sleep(3) # 线程暂停几秒,这里可以替换为需要计时的程序
end = time.perf_counter()
print('用时:{:.4f}s'.format(end-start))
运行结果:
(2)datetime
from _datetime import datetime
start = datetime.now()
time.sleep(3) # 线程暂停几秒,这里是需要计时的程序
end = datetime.now()
print('用时:{:.4f}s'.format((end-start).seconds))