接着上次的Python--数据类型、循环、运算符、容器的使用,首先扩展下字符串操作
字符串的操作也是我们开发中使用最频繁的操作,字符串的内存和列表一样,是一片连续的,python中字符串也是不可变的
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'))
运行结果:
upper()
和lower()
方法分别对应将字符串全部转为大写和小写:
print('hello'.upper())
print('WORld'.lower())
运行结果:
swapcase()
方法将字符串的大小写反转:
print('WORld'.swapcase())
运行结果:
capitalize()
方法将字符串的首字符转换为大写,其余字符转换为小写:
print('this is a Dog'.capitalize())
运行结果:
title()
方法将每个单词的首字符大写,其他字符小写:
print('this is a DoG'.title())
运行结果:
center()
方法将字符串居中,需要指定新的字符串的宽度
,并且可以指定填充符,默认为空格
:
print("world".center(20))
print("world".center(20, "$"))
运行结果:
ljust()
方法将字符串左对齐,参数和center()
方法相同:
print("world".ljust(20, "$"))
运行结果:
rjust()
方法将字符串右对齐,参数和center()
方法相同:
print("world".rjust(20, "$"))
运行结果:
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))
运行结果:
python内置了一些校验字符串的方法:
功能 | 方法 | 描述或例子 |
---|---|---|
是否合法 | isidentifier() | 字符串含有除了_以外的特殊符号构成,那么不合法 |
是否全部由空白字符组成 | isspace() | " \t ".isspace()为True |
是否全部由字母组成 | isalpha() | "1world".isalpha()为False |
是否全部由阿拉伯数字组成 | isdecimal() | "123".isdecimal()为True |
是否全部由数字组成 | isnumeric() | "一二三".isnumeric()为True |
是否全部由数字和字母组成 | isalnum() | "1world三".isalnum()为True |
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']))
运行结果:
python中字符串中使用占位符,调用%
或 format()
方法,传入对应占位符的参数,即可实现字符串的格式化
%
方式,字符串的占位符和c语言用法相同:
print("我是%s,今年%d" % ("张三", 18))
print("小数点后2位的小数:%.2f" % 8)
运行结果:
format()
方式,字符串的占位符使用{}
包裹索引
的方式,如需特殊处理,索引
后面跟上:
指定格式:
print("我是{0},今年{1}".format("张三", 18))
print("小数点后2位的小数:{0:.2f}".format(8))
运行结果:
Java中我们可以直接使用new String()
指定字符串的编码,也可以使用getBytes()
指定编码,将字符串转为字节数组
Python中使用encode()
方法和decode()
方法分别对应字符串编码成字节数组和将字节数组解码成字符串:
bys = "你好".encode(encoding="utf-8")
print(bys)
print(bys.decode(encoding="utf-8"))
运行结果:
功能 | 方法 | 描述或例子 |
---|---|---|
查找子串索引 | 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))
运行结果:
python中除了按照先后顺序传递参数外,还可以指定接受参数:
print(sum_func(b=10, a=20))
函数的参数还支持默认值,并且拥有默认值的参数,在调用时可以不传:
def do(name, something="清洁"):
print(name + "在做" + something)
do("张三")
运行结果:
python中函数的可变参数使用*
号,还支持可变键值对参数,使用**
,如果你熟悉c语言,你会感到很亲切:
*
可变参数:
def do(*args):
for item in args:
print(item)
do("起床", "刷牙", "洗脸", "吃早饭")
运行结果:
**
键值对可变参数:
def do(**args):
for k in args:
print(k, args[k])
do(张三="坐地铁上班", 李四="开车上班")
运行结果:
python中函数内定义的变量默认都是局部变量,使用global
关键字可以使之成为全局变量:
def fun():
global info1
info1 = 'hello'
fun()
print(info1)
运行结果:
python中使用try except
捕获异常:
try:
i = 10 / 0
except Exception as e:
print(e)
运行结果:
循环中我们可以使用else
来执行循环正常结束后的一块代码,同样try except
中也可以使用else
,来执行无异常发生时的一块代码:
try:
i = 10 / 2
except:
pass
else:
print("无异常发生")
运行结果:
finally
是无论发生异常与否,都会执行:
try:
i = 10 / 0
except Exception as e:
print(e)
finally:
print("执行结束")
运行结果:
该模块是python提供的异常处理模块,将异常信息异步操作,可输出到文件中:
import traceback
try:
i = 10 / 0
except:
traceback.print_exc()
print("程序结束")
运行结果:
python中定义类使用class
关键字:
class Person:
pass
p = Person()
python中的类也是一个对象,类的属性直接在类内部定义,外部使用类名.属性名
进行访问:
class Person:
clz_attr = "类属性"
print(Person.clz_attr)
实例对象为通过类的构造函数创建的对象,实例对象和类对象是指向与被指向的关系,python中实例对象拥有自己的属性,实例对象的属性定义在类的构造函数__init__()
中:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("张三", 18)
print(p.name, p.age)
运行结果:
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()
运行结果:
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()
运行结果:
实例对象的方法默认都会带有一个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()
运行结果:
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()
运行结果:
python支持多继承,定义类时指定继承的父类:
class Animal:
pass
class Person:
pass
class Man(Person, Animal):
pass
实现多态之前,先来看下方法重写,重写父类方法直接定义即可,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 函数/变量/类 | 该方式除了模块外,还支持类、变量的导入 |
创建模块和新建python文件一样,我们一般将模块单独新建一个文件夹:
内容:
def A():
print("模块A")
使用模块很简单,也没什么好说的
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)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有