字符串

字符串驻留机制

  • 仅保存一份相同且不可变字符串的方法,不同的值别存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续穿件相同的字符串时,不会开辟新的空间,而是把字符串的地址赋给新创建的变量

驻留机制的集中情况

  • 字符串的长度为0或1时
  • 符合标识符的字符串 不符合开辟多个内存区域
  • 字符串只在编译时驻留,而非运行时
  • [-5,256]之间的整数数字

sys中的intern方法强制2个字符串指向同一个对象

Pycharm对字符串进行了优化处理

c = ''.join(['ab','c'])

字符串的查询操作

方法 作用
index() 查子串substr第一次出现的位置,如果查找的字符串不存在时,则抛出异常ValueError
rindex() 查找子串substr最后一次出现的位置,如果查找子串不存在时,则抛出ValueError
find() 查找子串substr第一次出现的位置,如果查找子串不存在时,则返回-1
人find() 查找子串substr最后一次出现的位置,如果查找子串不存在时,则返回-1

字符串大小写转换操作

方法 作用
upper() 把字符串中的所有字符都转换成大写字母
lower() 把字符串中的所有字符都转换成小写字母
swapcase() 把字符串中所有大写字母转换成小写字母,把所有的小写字母都转成大写字母
capitalize() 把第一个字符转换为大写,把其余字符转换为小写
title() 把第一个单词的第一个字符转换为大写,把每一个单词的剩余字符串装换位小写

字符串的对齐操作

方法 操作
center() 居中对齐,第一个参数指定宽度,第2个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际的宽度则返回原字符
ljust() 左对齐,第一个参数指定宽度,第2个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际的宽度则返回原字符
rjust() 右对齐,第一个参数指定宽度,第2个参数指定填充字符,第二个参数是可选的,默认是空格,如果设置宽度小于实际的宽度则返回原字符
zfill() 右对齐,左边用0填补,该方法只接受一个参数,用于指定字符串的宽度,如果指点的宽度小于等于字符串的长度,返回字符串本身

字符串的劈分方法

方法 操作
split() 从字符串的左边开始劈分,默认的劈分字符的是空格字符串,返回的都是一个列表|通过参数sep指定劈分字符串是的劈分符|通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独作为一部分
rsplit() 从字符串的右边开始劈分,默认的劈分字符的是空格字符串,返回的都是一个列表|通过参数sep指定劈分字符串是的劈分符|通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独作为一部分

判断字符串操作的方法

方法 操作
isidentifier() 判断指定字符串是不是合法的标识符
isspace() 判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)
isalpha() 判断指定的字符串是否全部由字母组成
isdecimal() 判断指定的字符串是否由全部由十进制的数字组成
isnumeric() 判断指定的字符串是否全部由数字组成
isalnum() 判断指定字符串是否全部由字母和数字组成

字符串的其他操作

方法 操作
replace() 第一个参数指定被替代的字符串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法是可以通过第三个参数指定最大替换次数
join() 将列表或元组中的字符串合并成一个字符串

字符串的比较操作

  • 运算符 > < >= <= == !=
  • 比较规则:
    • 首先比较字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其余的比较结果就是连个字符串的比较结果,连个字符串中的所有后续字符串将不在被比较
  • 比较原理:
    • 两个以上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符串的ordinal value。与内置函数ord 对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符

这里的原始值比较的是ASCLL编码的值

字符串的切片操作

  • 字符串时不可变类型,不可以进行删、改、增操作
  • 切片将产生新的对象
s='hello python'
s1 = s[:5]
s2 = s[6:]
print(s1)
print(s2)
hello
python

格式化字符串

格式化字符串可以降低在字符串拼接时,产生的多个子串的冗余空间,减少资源的开销。

格式化字符串的两种方式:

  • %作为站位符
    • %s ------字符串
    • %i或%d ----整数
    • %f -----------浮点数
name = "张三"
age = 20
print('我叫%s,年龄%d'%(name,age))
我叫张三,年龄20
  • {}作为占位符
name = "张三"
age = 20
print('我叫{0},年龄{1}'.format(name,age))
我叫张三,年龄20

python3:

name = "张三"
age = 20
print(f'我叫{name},今年{age}')
我叫张三,今年20

字符串的编码转换

  • 编码:将字符串转换成二进制数据(bytes)
  • 解码:将bytes类型的数据转换成字符类型
s = '天涯'
print(s.encode(encoding='GBK'))#在GBK中文编码中一个中文站2个字节
print(s.encode(encoding='UTF-8'))#在GBK中文编码中一个中文站3个字节
byte = b'\xcc\xec\xd1\xc4'
BYTE =b'\xe5\xa4\xa9\xe6\xb6\xaf'
print(byte.decode(encoding='GBK'))
print(BYTE.decode(encoding='utf-8'))
b'\xcc\xec\xd1\xc4'
b'\xe5\xa4\xa9\xe6\xb6\xaf'
天涯
天涯

函数

函数是执行特定的任务和以完成特定的方法的一段代码

为什么学要函数?

  • 复用代码
  • 隐藏实现细节
  • 提高可维护性
  • 提高可读性便与调试

函数的创建:

def 函数名 ([]):
	函数体
	[return xxx]

例子:

def getNum(a,b):
    if(a>b):
        return a
    else:
        return b
if __name__ == '__main__':
    print(getNum(1,5))

函数的传递、形参、实参

def xxx(形参):

​ .........

xxx(实参)

参数传递:

  • 位置实参
    • 根据位置形参对应的位置进行实参传递
  • 关键字实参
    • 更据形参名称进行实参传递

xxx(a=xx,b=xx)

形式参数和实际参数的名称可以不相同,对于不可变的数据对象对他操作无法改变值,只能改变对象应用中的内部元素的值:列表、字典、集合

函数的返回值

  • 没有返回值
  • 函数的返回值,如果是一个直接返回
  • 函数返回多个返回值,返回的结果是元组
def getNum(num):
    odd=[]
    even=[]
    for i in num:
        if i%2==0:
            odd.append(i)
        else:
            even.append(i)
    return odd,even
if __name__ == '__main__':
    print(getNum(range(11)))
    s= getNum(range(11))
    for i in s:
        print(i)
([0, 2, 4, 6, 8, 10], [1, 3, 5, 7, 9])
[0, 2, 4, 6, 8, 10]
[1, 3, 5, 7, 9]

函数的定义默认值参数

  • 定义函数时,给形参设置默认参数值,只有与默认值不符的时候才需要传递实参
def fun(a,b=10)
	....
fun(100)#b=10
fun(20,30)#30将默认10替换

个数可变的位置参数

  • 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
  • 使用*定义个数可变的位置形参
  • 结果为一个元组
def fun(*args):
	print(args)
fun(10)
fun(10,20,30)
(10,)
(10,20,30)

个数可变的关键字形参

  • 定义参数时,无法事先确定传递关键字实参的个数时,可以使用可变的关键字形参
  • 使用**定义个数可变的关键字形参
  • 结果为一个字典
def fun(**agrs):
	print(args)
fun(a=10)
fun(a=10,b=20,c=30)
{'a':10}
{'a':10,'b':20,'c':30}

变量的作用域

  • 程序代码能访问该变量的区域
  • 更据变量的有效范围可分为:
    • 局部变量:
      • 函数内定义并使用的变量,只在函数内部有效,局部变使用global声明,这个变量就会变成全局变量
    • 全局变量
      • 函数体外定义的变量,可作用于函数体内

递归函数

如果在一个函数体的内部调用了该函数体本身,那么这个函数就被称为递归函数

  • 递归函数的组成:
    • 递归调用与递归停止
  • 递归调用过程
    • 每一次递归调用依次函数,都会在栈内分配一个栈帧
    • 每次执行完一次函数,就会释放相应的空间
  • 递归的优缺点:
    • 缺点:占用的内存多,效率低
    • 有带你:思路和代码简单
def fun(num):
    if num==1:
        return 1
    else:
        return num*fun(num-1)
print(fun(10))
3628800

bug

常见的bug

  • input()返回的类型时str类型 ,结果与相应的比较时要进行类型转换。SyntaxError
  • 注意使用英文输入
  • 语法错误 = = 缩进错误
  • 索引越界问题 IndexError
  • append不熟练

类似try catch

但是在python中是**try except xxx: **

try:
    n1 = int(input("请输入数字"))
    n2 = int(input("请输入数字"))
    result = n1/n2
    print('结果是',result)
except ZeroDivisionError:
    print('除数不能为0')
except ValueError:
    print('不能将字符串转换成数字')
except BaseException as e:
    print(e)

处理异常的代码结果块

  • try --except----else

如果try块中没有抛出异常执行的是else块中的代码,如果try块中抛出异常这执行except块中的代码

  • try--except----else----finally

如果try块中没有抛出异常执行的是else块中的代码,如果try块中抛出异常这执行except块中的代码,无论是否抛出异常都会执行finally中的代码,通常用来执行try中对于资源的关闭

python的异常类型

异常类型 描述
ZeroDivisionError 除(或取模)零(所有数据类型)
IndexError 序列中没有此索引
KeyError 映射中没有这个建
NameError 未声明/初始化对象(没有这个属性)
SyntaxError Python语法错误
ValueError 传入无效的参数

异常处理模块

  • traceback模块
import traceback
try:
	print('1.------------')
	print(1/0)
except:
	traceback.print_exc()
Traceback (most recent call last):
  File "D:\pycharm2020.1_workspace\learnTest\learnPython\__init__.py", line 194, in <module>
    print(1/0)
ZeroDivisionError: division by zero
1.------------

DeBug调试

posted on 2022-07-04 07:41  Steam残酷  阅读(64)  评论(0)    收藏  举报