python学习笔记-第3章-基本数字类型

3.1数字类型

3.1.1数字类型概述

python提供3种数字类型:整数、浮点数和复数,分别对应数学中的整数、实数和复数

3.1.2整数类型

进制种类引导符号描述
十进制默认情况,录入,1010,-425
二进制0b或0B由字符0和1组成,例如,0b101,0B101
八进制0o或0O由字符0到7组成,例如0o711,0O711
十六进制0x或0X由字符0到9、a到f、A到F组成,例如,0xABC

pow(x,y,z)计算 x ^ y mod z

3.1.3浮点数类型

科学计数法使用字母e或E作为幂的特点,以10为奇数

<a>e<b> = a * (10) ^ b

例如
4.3e-3 的值为0.0043
9.6E5 也可表示为9.6E + 5 ,其值为960000.0

在python中超过15位数字计算浮点数会产生误差,,但python支持无限制且准确的整数运算

如果希望获得更高的精度计算结果,往往采用整数而不直接采用浮点数

例如

print(3.141592653 * 1.234567898)
print(3141592653  * 1234567898)

结果:
3.8785094379864535
3878509437986453394

扩展:高精度浮点运算类型

python通过标准库decimal提供了一个更精确的数字类型Decimal,这个类型利用上问所介绍的整数运算方法提供搞精度的浮点数运算,并可以使用getcontext().prec参数自定义浮点数精度的位数

import decimal
a = decimal.Decimal('3.141592653')
b = decimal.Decimal('1.234567898')
decimal.getcontext().prec = 20
print(a * b)

结果:

3.878509437986453394

注意在使用decimal库时,Decimal(‘数字’)是高精度数字的基本表示形式,需要使用单引号。

3.1.4复数类型

j = 根号(-1) ,复数可以看做是二元有序实数对(a,b)表示为a + bj

python 中复数的虚数部分通过后缀 “J”“j” 来表示,例: 12.3 + 4j

复数类型中实数部分和虚数部分的数值都是浮点类型。对于复数z,可以用z.realz.imag分别获得它的实数部分和虚数部分

print ((1.23e-4 + 5.67e+89j).real)
print ((1.23e-4 + 5.67e+89j).imag)

结果:
0.000123
5.67e+89


3.2数字类型的操作

3.2.1内置的数值运算操作符

操作符描述
x // yx与y之整数商,即不大于x与y之商的最大整数
x ** yx的y次幂,即x ^ y

三种数字类型之间存在一种逐渐扩展的关系:
整数 -> 浮点数 -> 复数

3.2.2内置的数值运算函数

函数描述
abs(x)x的绝对值
divmod(x,y)(x //y, x % y),输出为二元组形式(也称为元组类型)
round(x[,ndigits])对x四舍五入,保留ndigits位小数。round(x)返回四舍五入的整数值
max(x1,x2…,xn)求最大值,n没有限定
min(x1,x2…,xn)求最小值,n没有限定
>>> divmod(3,7)
(0, 3)
>>> abs( -34)
34
>>> round(3.1415926,4)
3.1416

3.2.3内置的数字类型转换函数

函数描述
int(x)将x转换为整数,x可以是浮点数或字符串
float(x)返回浮点数x或字符串x所对应的整数类型
complex(re[,im])生成一个复数,实部为re,虚部为im,re可以是整数、浮点或字符串,im可以是整数或浮点数但不能为字符串
>>> int(10.99)
10
>>> complex(10.99)
(10.99+0j)
>>> float("123456")
123456.0
>>> float('456789')
456789.0
>>> int("234")
234
>>> int("abcde")
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    int("abcde")
ValueError: invalid literal for int() with base 10: 'abcde'

3.3模块1:math库的使用

引用方法
第一种: import math
第二种:from math import <函数名>

常数数学表示描述
math.piπ圆周率,值为3.141592653589793
math.ee自然对数,值为2.718281828459045
math.inf无穷正无穷大,负无穷大为-math.inf
>>> import math
>>> math.pi
3.141592653589793
>>> math.e
2.718281828459045
>>> math.inf
inf
>>> 
函数描述
math.fmod(x,y)返回x与y的模
math.fabs(x)返回x的绝对值
math.fsum([x,y,…])浮点数精确求和
math.factorial(x)返回x的阶乘,如果x是小数或负数,返回ValueError
math.gcd(a,b)返回a与b的最大公约数
math.modf(x)返回x的小数和整数部分
math.trunc(x)返回x的整数部分
>>> math.factorial(40)
815915283247897734345611269596115894272000000000
>>> 0.1+0.2+0.3
0.6000000000000001
>>> import math
>>> math.fsum([0.1+0.2+0.3])
0.6000000000000001
>>> math.fsum([0.1,0.2,0.3])
0.6
>>> 

浮点数,在python解释器内部表示时存在一个小数点后若干位的精度尾数,当浮点数进行运算时,这个精度尾数可能会影响输出结果。因此,在涉及浮点数运算及结果比较时,建议采用math库提供的函数,而不直接采用python提供的运算符

幂对函数描述
math.pow(x,y)返回x的y次幂
math.exp(x)返回e的x次幂,e是自然对数
math.expml(x)返回e的x次幂减1
math.sqrt(x)返回x的平方根
math.log(x[,base])返回x的对数值,只输入x时,返回自然对数,即lnx
>>> math.exp(3)
20.085536923187668
>>> math.pow(10,1/3)
2.154434690031884

3.4实例:天天向上

一年365天,一周工作5个工作日,每天可以提高1% ,在周末放任一下,能力下降1%

dayup,dayfactor = 1.0,0.01
for i in range(365):
    if i % 7 in [6,0]:  #周末休息
        dayup = dayup * (1 - dayfactor)
    else:
        dayup  = dayup * ( 1 + dayfactor)


print("向上五天,向下2天的力量:{:.2f}".format(dayup))

结果:
向上五天,向下2天的力量:4.63

3.5 字符串类型及操作

3.5.1 字符串类型的表示

一对单引号(‘’):仅可表示单行字符串
一对双引号(“”):仅可表示单行字符串
一对三引号(’’’ ‘’’):可以表示单行或多行字符串

3.5.2基本的字符串操作符

操作符描述
x + y连接两个治疗费从x与y
x*n 或n * x复制n次字符串x
x is s如果x是s的字串,返回True ,否则返回False
str[i]索引,返回第i个字符
str[N:M]切片,返回索引第N到第M的子串,其中不包括M
>>> "hello" +  "world"
'helloworld'
>>> "我好帅" * 3
'我好帅我好帅我好帅'
>>> "帅" in "我好帅"
True

【实例】:获取星期字符串

weekstr = "星期一星期二星期三星期四星期五星期六星期天"
day = eval(input("请输入星期数字(1 - 7):"))
pos = (day - 1) * 3
print(weekstr[pos:pos+3])

结果:
请输入星期数字(1 - 7):3
星期三

特殊的格式化控制字符描述
\a蜂鸣,响铃
\b
\f换页
\n换行,光标移动到下行首行
\r回车,光标移动到本行首行
\t水平制表
\v垂直制表
\0NULL,什么也不做

3.5.3内置的字符串处理函数

python3以Unicode字符为计数基础, 因此,字符串中英文字符和中文字符都是1个单位长度

内置的字符串处理函数描述
len(x)返回字符串x的长度,也可返回其他组合数据类型元素个数
str(x)返回任意类型x所对应的字符串形式
chr(x)返回Unicode编码x对应的单字符
ord(x)返回单字符表示的Unicode编码
hex(x)返回整数x对应十六进制的小写形式字符串
oct(x)

凯撒密码

plaincode = input("请输入明文:")   #加密
for p in plaincode:
    if ord('a') <= ord(p) <= ord('z'):
        print(chr(ord('a') + (ord(p) - ord('a') + 3) % 26),end='')
    else:
        print(p,end='')

print()

t = input("请输入密文:")  #解密
for i in t:
    if ord('a') <= ord(i) <= ord('z'):
        print(chr((ord(i) - ord('a') - 3 )% 26  + ord('a')),end = '')
    else:
        print(i,end='')


结果:
请输入明文:hello world
khoor zruog
请输入密文:khoor zruog
hello world

3.5.4内置的字符串处理方法

方法描述
str.lower()返回字符串str的副本,全部字符小写
str.upper()返回字符串str的副本,全部字符大写
str.islower()当str所有字符都是小写时,返回True,否则返回False
str.isprintable()当str所有字符都是可打印的,返回True,否则返回False
str.isnumberic()当str所有字符都是数字时,返回True,否则返回False
str.split(sep=None,maxsplit= -1)返回一个列表,由str根据sep被分割的部分构成,默认分隔符为空格,maxsplit阐述为最大分割次数,默认maxsplit参数可以不给出
str.count(sub[,start[,end]])返回str[start:end]中sub子串出现的次数
str.replace(old,new[,count])返回字符串str的副本,所有old子串被替换成new,如果count给出,则前count次old出现被替换
str.zfill(width返回字符串str的副本,长度为width,不足的部分在左侧添‘0’,但如果str最左侧是字符‘+’ 或者‘-’,则从第二个字符左侧添加‘0’
>>> hex(255)
'0xff'
>>> "python is an excellent language.".split()
['python', 'is', 'an', 'excellent', 'language.']
>>> "-123".zfill(10)
'-000000123'
>>> "python is an excellent language".replace('s','a')
'python ia an excellent language'

3.6字符串类型的格式化

3.6.1 format()方法的基本使用

字符串format()方法的基本使用格式如下:
<模板字符串>.format(<逗号分隔的参数>)

模板字符串由一系列槽组成,用来控制字符串中嵌入值出现的位置,其基本思想是将format()方法中逗号分隔的阐述按照序号关系替换到模板字符串的槽中。槽用大括号({})表示,如果大括号中没有序号,则按照出现顺序替换

>>> "{}最高,{}最胖,{}最帅。".format("老大","老二","老三")   #下标从0开始
'老大最高,老二最胖,老三最帅。'
>>> "{2}最高,{0}最胖,{1}最帅。".format("老大","老二","老三")
'老三最高,老大最胖,老二最帅。'

3.6.2 format()方法的格式控制

format()方法中模板的字符串的槽除了包括参数符号,还可以包括格式控制信息,此时,槽的内部样式如下:

{<参数序号>: <格式控制标记>},其中格式控制标记用来控制参数显示时的格式:

:<填充><对齐><宽度>< , ><.精度>类型
引导符号用于填充的单个字符<左对齐;>右对齐;^居中对齐;槽的设定输出宽度数字的千位分割符,适用于整数和浮点数浮点数小数部分的精度或字符串的最大输出长度整数类型b,d,o,x,X;浮点数类型e,E,f,%
>>> s = "PYTHON"
>>> "{0:30}".format(s)              #默认使用空格填充
'PYTHON                        '
>>> "{0:>30}".format(s)               #右对齐
'                        PYTHON'
>>> "{0:*^30}".format(s)               #居中且使用*填充
'************PYTHON************'
>>> "{0:-^30}".format(s)              #居中且使用-填充
'------------PYTHON------------'
>>> "{0:-^30,}".format(1234567890)    #使用,分隔
'--------1,234,567,890---------'
>>> "{0:-^30}".format(1234567890)    #对比输出
'----------1234567890----------'
>>> "{0:-^30,}".format(12345.67890)
'---------12,345.6789----------'

<精度>表示两个含义,由小数点(.)开头。对于浮点数,精度表示小数部分输出的有效位数。对于字符串,精度表示输出的最大长度

>>> "{0:.2f}".format(123456.6547890)
'123456.65'
>>> "{0:H^20.2f}".format(123456.6547890)
'HHHHH123456.65HHHHHH'
>>> "{0:H^.4}".format("python")
'pyth'
>>> 

整数类型格式

类型描述
b输出整数的二进制方式
c输出整数对应的Unicode字符
d输出整数的十进制方式
o输出整数的八进制方式
x输出整数的小写16进制方式
X输出整数的大写16进制方式
>>> "{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
'110101001,Ʃ,425,651,1a9,1A9'

浮点数类型

类型描述
e输出浮点数对应的小写字母e的指数形式
E输出浮点数对应的大写字母E的指数形式
f输出浮点数的标准浮点形式
%输出浮点数的百分形式

3.7 实例4:文本进度条

3.7.1 简单的开始

import time

scale = 10
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("------执行结束------")

执行结果

------执行开始-----
% 0 [->....................]
%10 [**->..................]
%20 [****->................]
%30 [******->..............]
%40 [********->............]
%50 [**********->..........]
%60 [************->........]
%70 [**************->......]
%80 [****************->....]
%90 [******************->..]
%100[********************->]
------执行结束------

3.7.2单行动态刷新

import time

for i in range(101):
    print("\r{:3}%".format(i),end='')  #回到行首
    time.sleep(0.5)

执行结果为动态刷新

 53%

3.7.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,'-'))

出现了个异常

-----------执行开始----------
Traceback (most recent call last):
  File "F:\pythonworkspace\1example\main.py", line 4, in <module>
    t = time.clock()
AttributeError: module 'time' has no attribute 'clock'

找了下原因

Python3.8不再支持time.clock,但在调用时依然包含该方法;

有效处理:
time.perf_counter() 替换

import time
scale = 50
print("执行开始".center(scale//2,'-'))  #居中
t = time.perf_counter()
for i in range(scale + 1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i / scale) * 100
    t -= time.perf_counter()
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
    time.sleep(0.05)
print("\n" + "执行结束".center(scale//2,'-'))

执行结果

-----------执行开始----------
100%[**************************************************->]89.38s
-----------执行结束----------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ofo300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值