Python--字符串、函数、异常处理、面向对象

接着上次的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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值