接着上次的Python--数据类型、循环、运算符、容器的使用,首先扩展下字符串操作
一、字符串
字符串的操作也是我们开发中使用最频繁的操作,字符串的内存和列表一样,是一片连续的,python中字符串也是不可变的
1. 查找子串索引
index()
和rindex()
方法分别对应从左开始查找和从右开始查找子串:
s = 'hello'
print(s.index('l'))
print(s.rindex('l'))
运行结果:
但可惜的是如果子串不存在,这两个方法会抛出异常:
s = 'hello'
print(s.index('a'))
print(s.rindex('a'))
运行结果:
使用find()
和rfind()
方法则不会抛出异常,找不到返回-1
:
s = 'hello'
print(s.find('a'))
print(s.rfind('a'))
运行结果:
2. 大小写转换
2.1 大小写全部转换
upper()
和lower()
方法分别对应将字符串全部转为大写和小写:
print('hello'.upper())
print('WORld'.lower())
运行结果:
2.2 大小写反转
swapcase()
方法将字符串的大小写反转:
print('WORld'.swapcase())
运行结果:
2.3 首字母大写
capitalize()
方法将字符串的首字符转换为大写,其余字符转换为小写:
print('this is a Dog'.capitalize())
运行结果:
title()
方法将每个单词的首字符大写,其他字符小写:
print('this is a DoG'.title())
运行结果:
3. 字符串对齐
3.1 字符串居中
center()
方法将字符串居中,需要指定新的字符串的宽度
,并且可以指定填充符,默认为空格
:
print("world".center(20))
print("world".center(20, "$"))
运行结果:
3.2 字符串左右对齐
ljust()
方法将字符串左对齐,参数和center()
方法相同:
print("world".ljust(20, "$"))
运行结果:
rjust()
方法将字符串右对齐,参数和center()
方法相同:
print("world".rjust(20, "$"))
运行结果:
4. 字符串分割
split()
方法将字符串按照指定的分隔符进行分割,返回一个列表,还可以指定最大分割次数:
print("w o r l d".split(sep=' '))
print("w o r l d".split(sep=' ', maxsplit=2))
运行结果:
与之对应的,rsplit()
方法是从右边开始分割:
print("w o r l d".rsplit(sep=' '))
print("w o r l d".rsplit(sep=' ', maxsplit=2))
运行结果:
5. 校验字符串
python内置了一些校验字符串的方法:
功能 | 方法 | 描述或例子 |
---|---|---|
是否合法 | isidentifier() |
字符串含有除了_ 以外的特殊符号构成,那么不合法 |
是否全部由空白字符组成 | isspace() |
" \t ".isspace()为True
|
是否全部由字母组成 | isalpha() |
"1world".isalpha()为False
|
是否全部由阿拉伯数字组成 | isdecimal() |
"123".isdecimal()为True
|
是否全部由数字组成 | isnumeric() |
"一二三".isnumeric()为True
|
是否全部由数字和字母组成 | isalnum() |
"1world三".isalnum()为True
|
6. 字符串替换和合并
replace()
方法将字符串中指定的子串替换为别的子串,支持替换次数:
print("1132112".replace('1', '6', 3))
运行结果:
join()
方法将字符串元素的元组或列表合并为一个字符串:
print(''.join(('a', 'b', 'c')))
print('|'.join(('a', 'b', 'c')))
print(''.join(['a', 'b', 'c']))
print('|'.join(['a', 'b', 'c']))
运行结果:
7. 字符串格式化
python中字符串中使用占位符,调用%
或 format()
方法,传入对应占位符的参数,即可实现字符串的格式化
7.1 %方式
%
方式,字符串的占位符和c语言用法相同:
print("我是%s,今年%d" % ("张三", 18))
print("小数点后2位的小数:%.2f" % 8)
运行结果:
7.2 format()方式
format()
方式,字符串的占位符使用{}
包裹索引
的方式,如需特殊处理,索引
后面跟上:
指定格式:
print("我是{0},今年{1}".format("张三", 18))
print("小数点后2位的小数:{0:.2f}".format(8))
运行结果:
8. 字符串编码
Java中我们可以直接使用new String()
指定字符串的编码,也可以使用getBytes()
指定编码,将字符串转为字节数组
Python中使用encode()
方法和decode()
方法分别对应字符串编码成字节数组和将字节数组解码成字符串:
bys = "你好".encode(encoding="utf-8")
print(bys)
print(bys.decode(encoding="utf-8"))
运行结果:
9. 字符串操作总结
功能 | 方法 | 描述或例子 |
---|---|---|
查找子串索引 | index() |
从左开始查找,子串不存在则抛出异常 |
rindex() |
从右开始查找,子串不存在则抛出异常 | |
find() |
从左开始查找,子串不存在则返回-1
|
|
rfind() |
从右开始查找,子串不存在则返回-1
|
|
大小写转换 | upper() |
将字符串全部转为大写:'hello'.upper() |
lower() |
将字符串全部转为小写:'WORld'.lower() | |
swapcase() |
将字符串的大小写反转:'WORld'.swapcase() | |
capitalize() |
将字符串的首字符转换为大写,其余字符转换为小写:'this is a Dog'.capitalize() | |
title() |
将每个单词的首字符大写,其他字符小写:'this is a DoG'.title() | |
字符串对齐 | center() |
将字符串居中,需要指定新的字符串的宽度 ,并且可以指定填充符,默认为空格 :"world".center(20, "$") |
ljust() |
将字符串左对齐:"world".ljust(20, "$") | |
rjust() |
将字符串右对齐:"world".rjust(20, "$") | |
字符串分割 | split() |
将字符串按照指定的分隔符进行分割,返回一个列表,还可以指定最大分割次数:"w o r l d".split(sep=' ', maxsplit=2) |
rsplit() |
从右边开始分割:"w o r l d".rsplit(sep=' ', maxsplit=2) | |
校验字符串 | isidentifier() |
是否合法,字符串含有除了_ 以外的特殊符号构成,那么不合法 |
isspace() |
是否全部由空白字符组成:" \t ".isspace()为True
|
|
isalpha() |
是否全部由字母组成:"1world".isalpha()为False
|
|
isdecimal() |
是否全部由阿拉伯数字组成:"123".isdecimal()为True
|
|
isnumeric() |
是否全部由数字组成:"一二三".isnumeric()为True
|
|
isalnum() |
是否全部由数字和字母组成:"1world三".isalnum()为True
|
|
字符串替换 | replace() |
将字符串中指定的子串替换为别的子串,支持替换次数:"1132112".replace('1', '6', 3) |
字符串合并 | join() |
将字符串元素的元组或列表合并为一个字符串:''.join(['a', 'b', 'c']) |
字符串格式化 |
% 方式 |
字符串的占位符和c语言用法相同:"小数点后2位的小数:%.2f" % 8 |
format() 方式 |
字符串的占位符使用{} 包裹索引 的方式,如需特殊处理,索引 后面跟上: 指定格式:"小数点后2位的小数:{0:.2f}".format(8) |
|
字符串编码 | encode() |
将字符串编码成字节数组:"你好".encode(encoding="utf-8") |
decode() |
将字节数组解码成字符串:bys.decode(encoding="utf-8") |
二、函数
python中定义函数使用def
关键字,并且python中函数可以赋值给变量:
def add(a, b):
return a + b
sum_func = add
print(sum_func(10, 20))
运行结果:
1. 传参
python中除了按照先后顺序传递参数外,还可以指定接受参数:
print(sum_func(b=10, a=20))
2. 参数默认值
函数的参数还支持默认值,并且拥有默认值的参数,在调用时可以不传:
def do(name, something="清洁"):
print(name + "在做" + something)
do("张三")
运行结果:
3. 可变参数
python中函数的可变参数使用*
号,还支持可变键值对参数,使用**
,如果你熟悉c语言,你会感到很亲切:
*
可变参数:
def do(*args):
for item in args:
print(item)
do("起床", "刷牙", "洗脸", "吃早饭")
运行结果:
**
键值对可变参数:
def do(**args):
for k in args:
print(k, args[k])
do(张三="坐地铁上班", 李四="开车上班")
运行结果:
4. 全局变量
python中函数内定义的变量默认都是局部变量,使用global
关键字可以使之成为全局变量:
def fun():
global info1
info1 = 'hello'
fun()
print(info1)
运行结果:
三、异常处理
1. 捕获异常
python中使用try except
捕获异常:
try:
i = 10 / 0
except Exception as e:
print(e)
运行结果:
2. 无异常处理
循环中我们可以使用else
来执行循环正常结束后的一块代码,同样try except
中也可以使用else
,来执行无异常发生时的一块代码:
try:
i = 10 / 2
except:
pass
else:
print("无异常发生")
运行结果:
3. 有无异常都处理
finally
是无论发生异常与否,都会执行:
try:
i = 10 / 0
except Exception as e:
print(e)
finally:
print("执行结束")
运行结果:
4. traceback模块
该模块是python提供的异常处理模块,将异常信息异步操作,可输出到文件中:
import traceback
try:
i = 10 / 0
except:
traceback.print_exc()
print("程序结束")
运行结果:
四、类
1. 类的定义
python中定义类使用class
关键字:
class Person:
pass
p = Person()
2. 类的属性
python中的类也是一个对象,类的属性直接在类内部定义,外部使用类名.属性名
进行访问:
class Person:
clz_attr = "类属性"
print(Person.clz_attr)
3. 实例属性
实例对象为通过类的构造函数创建的对象,实例对象和类对象是指向与被指向的关系,python中实例对象拥有自己的属性,实例对象的属性定义在类的构造函数__init__()
中:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("张三", 18)
print(p.name, p.age)
运行结果:
4. 类方法
python中定义类方法需要使用@classmethod
注解方法,方法内需要cls
入参,该参数即为类对象,可以通过类名.方法名
调用,也可以通过实例对象.方法名
调用:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def method(cls):
print("类方法")
p = Person("张三", 18)
p.method()
Person.method()
运行结果:
5. 静态方法
python中定义类的静态方法需要使用@staticmethod
注解方法,可以通过类名.方法名
调用,也可以通过实例对象.方法名
调用:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def method1():
print("静态方法")
p = Person("张三", 18)
p.method1()
Person.method1()
运行结果:
6. 实例方法
实例对象的方法默认都会带有一个self
的入参,相当于Java中的this
,该参数就是实例对象本身:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def do_something(self):
# 输出内存地址
print(id(self))
print(self.name, self.age)
p = Person("李四", 25)
print(id(p))
p.do_something()
运行结果:
7. 动态绑定
python中的函数也可以是一个变量,那么为实例对象赋值一个函数也是可以的:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def do_something(self):
# 输出内存地址
print(id(self))
print(self.name, self.age)
p = Person("李四", 25)
def show():
print("打印")
# 赋值一个函数
p.show = show
p.show()
运行结果:
四、类的继承和多态
1. 类的继承
python支持多继承,定义类时指定继承的父类:
class Animal:
pass
class Person:
pass
class Man(Person, Animal):
pass
2. 多态
实现多态之前,先来看下方法重写,重写父类方法直接定义即可,python中调用父类的方法使用super().方法名
class Animal:
def eat(self):
print("动物吃生肉")
class Person(Animal):
def eat(self):
super().eat()
print("人吃生肉")
p = Person()
p.eat()
运行结果:
接着还需要定义一些父子类,以及重写共同的方法:
class Animal:
def eat(self):
print("动物吃生肉")
class Person(Animal):
def eat(self):
print("人吃生肉")
class Man(Person):
def eat(self):
print("男人吃猪肉")
class Women(Person):
def eat(self):
print("女人吃青菜")
由于python中变量为弱类型,所以函数中并不知道传入的对象是什么数据类型,这也是python中的鸭子模型,python中并不关系对象,关心的只是对象的行为,即方法的调用:
def func(obj):
obj.eat()
func(Man())
func(Women())
运行结果:
五、模块
上面我们已经使用了trackback
模块,模块其实就是封装,将一些功能封装进一个模块,供外部使用,python中导入模块有两种方式:
导入方式 | 描述 |
---|---|
import 模块名 [as 别名] |
该方式只能导入整个模块 |
from 模块名称 import 函数/变量/类 |
该方式除了模块外,还支持类、变量的导入 |
1. 创建模块
创建模块和新建python文件一样,我们一般将模块单独新建一个文件夹:
内容:
def A():
print("模块A")
2. 使用模块
使用模块很简单,也没什么好说的
import
方式:
import module.modulA as ma
ma.A()
运行结果:
from
方式:
from module.modulA import A
A()
运行结果:
六、深浅拷贝
python中对象的拷贝,需要导入copy
模块,也就两个方法:copy()
和deepCopy()
,对应浅拷贝和深拷贝,浅拷贝只会拷贝当前实例对象,深拷贝会拷贝所有实例对象
import copy as copy
p1 = copy.copy(p)
p2 = copy.deepcopy(p)