今天讲解的主要是字符串及一些相关操作,外加一些零碎的东西
虚数表示
首先是虚数的表示
i = 10 + 25j # 注意j前面不能写个*,不然不表示复数而且出错
print(i)
输出结果:
(10+25j)
python的优势:计算速度快
import time;
a = time.time()
c = 12346578912343454353456*456798134344324363463445613*1345132165132135
print("计算时间为:" + str(time.time() - a))
print(c)
输出结果
计算时间为:0.0001766681671142578
7586403113436561761682566044163183359642352261218157064975147280
字符串操作
切片
python字符串与c不同,它不能直接在对应的字符串上修改,即对该字符串直接赋值,但是我们可以直接通过切片来操作
# 假设我们进行字符串里字符赋值
str = "abcdefg"
str[2] ='a'
报错:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-74410ba1bc2e> in <module>
10 b = str[ : :2] #表示对于整个字符串,步长为2,提取每隔1个字母,截取一个。
11 print(b)
---> 12 str[2] ='a'
TypeError: 'str' object does not support item assignment
它解释说字符串并不支持这种操作。如果是采用拼接方式,内存地址也已经发生改变。
a = "123456"
print(a)
print(id(a))
a = a[0:5] + '6'
print(a)
print(id(a))
输出结果:
123456
140392111853232
123456
140392111896176
说明哪怕字符串是一样的,但是内存地址已经发生改变了。
还要记住,python是没有数组概念的!
# 切片常见操作
# 字符串[开始索引:结束索引:步长] 开始索引是闭区间,结束索引是开区间,这个跟java的substring是一样的
str = "abcdefg"
print(str)
#拼接出我们要的
a = str[0:4:1] + 'a' + str[7:] #str[0:4:1]表示[0,4),记住是右闭合!!然后步长为1.
#str[7:]表示从下标为7开始至结束,步长默认为1
print(a)
输出结果:
abcdefg
abcda #a所拼接出的结果
步长
b = str[ : :2] #表示对于整个字符串,步长为2,提取每隔1个字母,截取一个。
print(b)
输出结果:
aceg
逆向操作
如果我们想要从字符串右边往左边操作就需要把步长改为负数,然后字符串右边第一个的下标是-1
str = "abcdefg"
print(str[ : :-1])
print(str[-1:-8:-1])
# 这两种表示方式是一样的,但是我更推荐第一种,因为我们不用特意算字符串长度
# 还有很多类似,比如str[-2: : -2],str[:-5:-3] 都是逆向的
输出结果:
gfedcba
gfedcba
我们一定要注意一点,只有步长才能表示字符串切片的方向,开始索引和结束索引的正负并不能决定
str = "abcdefg"
print(str[-4: : 1])
print(str[-4: : -1])
输出结果:
defg
dcba
从结果我们可以知道,如果步长为1,则说明从下标为-4,往右开始
而步长为-1,则说明从下标为-4,往左开始。
当然还可以这么操作
print(str[-4:5]) #不写步长,默认为1
输出结果:
de #从下标为-4,即d开始,到下标为5,即f结束,注意5是开区间,所以并没有加进去!!
转义字符
转义字符是一些功能性字符,通常是“\字符”表示
\n | 表示换行 |
---|---|
\r | 表示回车,将当前位置移到本行开头 |
\t | 跳到下一个Tab位置 |
\ | 表示一个反斜线’’ |
还有是一些在字符串表示 “、\、?等
如:
print("str\"aaa\'\\ ")
输出结果:
str"aaa'\
这样我们就可以在字符串中加入我们要的特殊符号了
print("abc\n")
print("abc",end="\n")
输出结果:
abc #有多一行换行是因为第一个print还有一个默认的end是换行的
abc
至于\r,可以实现一种动态效果,具体效果得自己操作得知,在此只附上源代码
import time
for i in range(0 , 1000, 50): #range(start,end,step) 开始(闭区间),结束(开区间),步长
print(i,end="\r")
time.sleep(1)
内建函数(又叫内置函数)
Python内置了很多函数和类型,具体的函数可以百度,这里就举例几个即可
a = -5
print(abs(a))
b = [1,2,3,4,5,6]
print(sum(b)) #也可以sum(range(1,7))
输出结果:
5
21
函数和方法的区别(我也不是很懂,暂时略)
从分类的角度来分析
(1)函数的分类:
- 内置函数
- 匿名函数
- 递归函数
- 自定义函数
(2)方法的分类:
- 普通方法:直接self调用的方法
- 私有方法:_函数名,只能在类中被调用的方法
- 属性方法:@property,将方法伪装成为属性,让代码更合理(我不懂)
- 特殊方法(双下划线方法):以__init__为例,是用来封装实例化对象的属性,只要是实例化对象就一定会执行__init方法,如果对象子类中没有则会寻找父类(超类),如果父类(超类)也没有,则直接继承object(python 3.x)类,执行类中的__init__方法。
- 类方法:通过类名的调用去操作公共模板中的属性和方法。
- 静态方法:不用传入类空间、对象的方法, 作用是保证代码的一致性,规范性,可以完全独立类外的一个方法,但是为了代码的一致性统一的放到某个模块(py文件)中。
其次,从作用域的角度来分析:
(1)函数作用域:从函数调用开始至函数执行完成,返回给调用者后,在执行过程中开辟的空间会自动释放,也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放。
(2)方法作用域:通过实例化的对象进行方法的调用,调用后开辟的空间不会释放,也就是说调用方法中对变量的修改值会一直保留。
最后,调用的方式不同。(个人觉得这个更好懂一些)
(1)函数:通过“函数名()”的方式进行调用。
(2)方法:通过“对象.方法名”的方式进行调用。
还要一些比较特殊的,比如调用模块。
import time
time.sleep(1) #表示的是函数(调用time这个模块里面的函数)