目录
链式赋值
使用这个方法会很方便进行变量交换
比起c++代码要见到多了,c++代码:
int a=1,b=2,t;
t = b;
b = a;
a = t;
提到了变量,顺便说一下常量。在c++中,如果要定义常量,所用到的方法是:
#define MAXN 16660
我们用这个方式,定义了常量MAXN,其值固定为16660。在Python中,其实是没有常量的,但出于习惯,我们把常量用大写表示,这意思是:写代码的人的逻辑上的常量,但是实际中可以进行值得改变。
自动转型:
整数和浮点数混合运算时,表达式结果自动转型成浮点数。
问题:整数可以多大?
在c/c++中,整型一般是16位。但是在Python中,整数想多大就多大,因为python被用来进行科学计算,这种类型的计算一把数都很大,所以在Python中,整数是可以很大的,没有溢出之类的问题发生。
科学计数法的一些表示:
100000 可以写成1e5或者1E5。
0.00001可以写成1e-4或者1E-4
3.14可以写成314e-2或者314E-2
浮点数(小数)float
科学计数法表示,3.14表示:314*(10**-2)(314E-2)
转为浮点数:foat()
这段代码实际在内存中:
同理,除了float(),还有int()函数。int()函数只是将数据取其整数部分,不会进行四舍五入的操作,如果所示:
如果要进行四舍五入(注意:这里的四舍五入跟数学中的不一样,具体看代码),可以使用round()函数:
(1)小数点后第一位小于等于4,舍去
(2)小数点后第一位等于5,也舍去
(3)小数点后大于5,才进行进一位操作
Python中的运算符
1、普通运算符
符号 | 用法 | 值 |
- | a,b=1,2 计算a-b | -1 |
+ | a,b=1,2 计算a+b | 3 |
* | a,b=1,2 计算a*b | 2 |
/ | a,b=1,2 计算a/b | 0.5 |
我们注意到做“/”时,返回的是个float类型的数,如果要进行整除,我们需要使用“//”,下面代码输出结果为0
a,b=1,2
print(a//b)
剩下的一些运算跟c/c++ 一样:
2、逻辑运算符+二进制运算
在c/c++里面,我们用:&&表示逻辑与,||表示逻辑或,!表示逻辑非
在Python里面:
二进制运算:
在Python中,&表示按位与,|表示按位或,^表示按位异或。用bin()函数,可以将一个数字转化为二进制,二进制在Python中的表示是以0b或者0B开头。
以下是小李子
a = 99
bin(a) #结果为0b1100011
b = 90
bin(b) #结果为0b1011010
b&a #结果为66
b|a #结果为123
b^a #结果为57
3、增强运算符
Python中的一些增强运算符:
+= 、-=、 *=
执行增强运算符时,比如:a = a + 1,先找到a的对象,然后新建一个对象,将a + 1后的值存入(包括类型、标志),然后将这个新的对象返回a,原来的a的对象会被回收(Python中一切都已对象为操作)
4、同一运算符
用于比较两个对象是否指向同一个内存单元。用is运算符,如果指向同一个内存单元,结果为True,否则结果为False
举例:
关于整数缓存问题
这里返回的结果是布尔值:True和False。True和False都是关键字,本质上,True=1,false=0
示例:
1、交互式界面
2、pycharm界面:
运算符“==”也可以进行判断两个数字是否相等,但是is比“==”效率高。如果在变量和None之间进行比较,应该用is
时间表示
首先要导入time库:
import time
时间计算:从1970年1月1日00:00:00(unix时间)开始计算计算时间:
time.time()获取当前时间,我们可以看到结果是一堆数字,这些数字代表什么?整数部分为现在离unix时间过了多少秒,小数部分表示的是微秒(1E-6)。我这里用了整数部分和小数部分进行时间的描述,因为时间本质上是一串数字,只不过整数用s做单位,小数部分用us做单位
字符串
字符串是Python中很重要的一块儿内容。在Python中字符串是不可以进行更改的,我们没有办法对原字符串做任何修改。可是明明关于字符串的操作很多,是怎么进行的?这就要用到这篇博客讲到的Python内存机制。
注意以下几点:
1、Python中没有字符这一说法,单字符也会被当做一个字符串使用,操作同字符串
2、Python3直接支持Unicode码,16个比特位表示一个字符(建议使用python3)。
3、使用内置函数ord()可以把单个字符转化成Unicode编码
s = 'u'
print(ord(s))
4、使用内置函数chr()可以吧十进制数字转为对应字符
a = 100
print(chr(a))
5、引号创建字符串,可以用单引号或者双引号,这两个等价。
(虽然s和t的值相等,但是指向不同的内存地址)
关于单引号与双引号的一些问题:
例如:a = "i'm a teacher",这句话是对的,结果如下图:
如果单引号‘I'm a teacher’,这样会出错,Python会认为I是个字符串,后面就会报错,结果如下图:
当然,也可以这样用:‘i"m a teacher’
6、连续的三个双引号或者单引号是个字符串,可以用来当注释使用
7、Python可以允许有空字符串的存在,其长度为零
转义字符
图片
一些小例子
字符串拼接:+号(会影响性能,+一次生成一个新对象)
a = '123'
b = '456'
print(a+b)
结果是:123456
+号两边要求操作数类型一样,否则会报错
字符串复制,*号
调用prinf时,,自动换行符,如果要取消,则print(123,end=''),end是加任何内容/*图片*/
控制台读取字符串
可以使用input()
str()实现其他类型转型字符串
s = 12
print(str(s))
""" 结果为 '12' """
将一个科学计数法自动计算并转为字符串
a = 1e6
print(str(a))
""" 结果为: ‘1000000’ """
字符串本质是字符序列;使用[]提取字符串,[]里面指定偏移量(索引),操作跟c/c++一样。只不过从后往前时,c++模式:
string str = "1244324"
int len = str.length()
for(int i=len-1; i>=0; i--)
{
cout<<str[i]
}
Python有另一种方式:
str = "1234342"
s[-1] '''结果为 ‘2’ '''
常用字符串函数
1、replace()字符串替换。
这里的字符串替换与之前所提到的str不可变是不矛盾的,有时候相对字符串做修改,我们可以用replace(),s.replace(),字符串是不会改变的。
2、字符串切片slice操作
切片slice的操作可以让我们快速提取字符串,标准格式[启示偏移量 start:种植偏移量 end: 步长 step]
实际裁剪:[start,end)(包头不包尾)
步长为1:隔0个取一个,即连续的
步长为2:隔1个取一个,即中间空一个
start end step 默认:start=0,end=len-1 step=1
其他操作:操作数为负的时候;可以从-1往回走。步长为负表明倒着取
3、split()和join()
spit()可以基于指定分隔符将字符串分割成多个字符串(存储到列表中),如果不指定分隔符,则默认使用空白字符(换行符、制表符、空格)
join()通常和列表一起使用(之前讲过+和*)
+与jion()对比:join()仅新建一次对象(性能较高),而每+一次,创建一次新对象,以下是+和join()所用时间对比图:
4、成员操作符
in/not in 判断某个字符(子字符串)是否在于字符串中,返回的结果为True或者False
5、其他:
Python中的字符串驻留机制:
同样用 is 或者 not is 操作,返回值为True或者False
如果是:
a = "fd*"
b = "fd*"
a is b
则结果为False。
目录
当我们确实需要修改字符串,但是每次用replace()函数不仅每次会生成一个新的对象,而且会效率低下,这时候,我们就可以引进IO,
from io import StringIO
a = "hello world"
# 创建可变字符串对象
sio = StringIO(a)
print(sio)
# <_io.StringIO object at 0x00000227F03090D8>
print(sio.tell()) # 获取当前文件读取指针的位置
print(sio.read()) # 从当前位置开始读取字符串
# hello world
print(sio.getvalue()) # 返回可变字符串的全部内容
# hello world
print(sio.tell()) # 11
sio.seek(6) # 用于移动文件读写指针到指定位置 【可以重新定位指针的位置】
sio.write("python") # 从seek(6)指定的位置开始写入字符串
print(sio.getvalue())
# hello python```