Python列表,字典,元组,字符串操作,文件操作,字符编码

1. 列表操作

1.1 列表的定义:

names = ["wangjing", "wangjun", "hashiqi"]
names[0] = "wangjing" ...

1.2 切片:取多个元素

names[1:3]    #包含左边,不包含右边
names[-1]      #列表中的最后一个元素
names[-3:]     #取列表的最后三个元素
names[0:3]=names[:3]    #取列表的前三个元素

1.3 追加

names.append('xiaojingzi')    #在列表的最后插入一个元素

1.4 插入

names.insert(1, 'liuyumao')    #插入一个元素,第一个参数为在列表中插入的位置

1.5 修改

names[2] = 'weichong'    #将列表的第三个元素修改

1.6 删除

names.remove('weichong')        #删除列表中'weichong'的元素
names.pop(1)                           #删除列表中第二个元素,并返回
del names[1]                            #第三种方法

1.7 扩展

names2 = [1, 2, 3, 4] 
names.extend(names2)    #['#jjkj', '4djisd', 'hashiqi', 'wangjing', 'wangjun', 1, 2, 3, 4]

1.8 copy

# 浅copy的三种形式
p1 = copy.copy(person)
p2 = person[:]
p3 = list(person)
#浅copy的用途,创建联合账号
person = ['name', ['saving', 100]]
p1 = copy.copy(person)
p2 = person[:]
p1[0] = 'ales'
p2[0] = 'fengjia'
p1[1][1] = 2000
print(p1)
print(p2)
# p1 p2 的saving都发生了变化
# 深copy的形式
names3 = copy.deepcopy(names)

1.9 统计

names=['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
names.count("Amy")            # 2

1.10 排序

names.sort()    #特殊字符,数字,大写字母,小写字母,不同的数据类型不能够放在一起排序,报错

1.11 反转

names.reverse() #反转

1.12 获取下标

names.index('xiaojingzi')    # 获取下标

2 元组

元组和列表差不多,只是一旦创建,便不能修改

names = ("alex","jack","eric")
names.count('alex')       #统计元素的个数            
names.index('ales')        #获取元素的索引

3 字符串操作

name = 'My \t name is {name} and i am {years} old'

print(name.capitalize())        # 首字母大写,不改变原来的字符串
print(name.count('a'))          # 统计字符的个数
print(name.center(50, '-'))     # name居中,不够的使用-补齐
print(name.endswith('ax'))      # 判断字符串是否是以某某结尾
print(name.expandtabs(tabsize=30))      # 扩展tab键
print(name.find('l'))   # 查找字符
print(name[3:])     # 字符串的切片
print(name.format(name='alex', years=20))   # format的格式
print(name.format_map({'name': 'laex', 'years': 12}))   # 字典
print('avc278'.isalnum())   # 只包含英文字符和数字
print('abA'.isalpha())  # 纯英文字符
print('1A'.isdecimal())     # 是否是十进制
print('232'.isdigit())  # 判断是否是数字
print('True'.isidentifier())      # 判断是否是合法的标识符
print('a A'.islower())  # 判断是不是小写
print('33.3'.isnumeric())   # 判断是不是数字
print(' '.isspace())    # 判断是不是空格
print('My Name Is'.istitle())   # 判断是不是标题,每个字母开头必须大写
print('My Name Is'.isprintable())   # 判断是否能够打印
print('My Name Is'.isupper())   # 判断是否是大写
print([''.join(['1', '2', '3'])])  # 字符拼接成字符串
print(name.ljust(50, '*').format(name='wangjing', years=20))    # 保证最小长度为50,不够长度在最右边补*
print(name.rjust(50, '-').format(name='wangjing', years=20))    # 保证最小长度为50,不够长度在最左边补-
print('Ales'.lower())   # 字符串全部转换成小写
print('Ales'.upper())   # 字符串全部转换成大写
print('\nAlex\n'.lstrip())    # 去掉左边的空格和回车
print('\nAlex\n'.rstrip())    # 去掉右边的空格和回车
print('\nAlex\n'.strip())   # 同时去掉左边和右边的回车以及换行
p = str.maketrans('abcdef', '123456')   # 将abcdef 分别用123456来代替
print('alex li'.translate(p))   # 使用P的代替规则来改写字符串
print('alesl'.replace('l', 'L', 1))     # 将原字符串中的内容使用新的字符来代替,1代表代替其中的几个字符
print('alesl'.rfind('8'))   # 从左往右查找返回靠右侧的所查找的字符的索引,查找不到返回-1
print('alex lil'.split('l'))   # 将字符串按照空格(默认)分割
print('alex\n lil'.splitlines())   # 将字符串按照换行分割
print('alex li'.swapcase())     # 字符全部转换成大写
print('ales li'.title())        # 字符转换成标题输出,每个单词大写
print('lex li'.zfill(50))       # 不够用0填充

4 字典操作

4.1 字典的语法

info = {
    'stu1101': 'TengLan Wu',
    'stu1102': 'LongZe Luola',
    'stu1103': 'XizoZe Maliya'
}

字典的特性:

字典是无序的并且关键字必须是唯一的

4.2 增加

info['stu1104'] = 'CangjingKong'    # 字典增加

4.3 修改

info['stu1101'] = '武藤兰'     # 字典修改

4.4 删除

del info['stu1101']     # 字典删除
info.pop('stu1102')     # 字典删除
info.popitem()          # 随机删除一个

4.5 字典查询

info.get('stu1103')        #安全获取,没有的话返回none
info['stu1101']

4.6 字典合并

b = {
    'stu1104': 'xiaojignzi',
    'stu1106': 'xiaojunzi'
}
info.update(b)  # 两个字典合并,如果info中有的元素,则修改,如果没有,则添加

4.7 字典转换成列表

print(info.items())  # 字典转换成列表

4.8 字典的初始化

c = dict.fromkeys([6, 7, 8], [1, {'name': 'alex'}, 444])    # 初始化字典
c[7][1]['name'] = 'Jack'        #注意:三个占用同一个内存,一个修改全部修改
# {8: [1, {'name': 'Jack'}, 444], 6: [1, {'name': 'Jack'}, 444], 7: [1, {'name': 'Jack'}, 444]}

4.9 判断是否在字典中

'stu1103' in info

4.10 字典中有该元素不做操作,没有则添加

info.setdefault('stu1103', 'baiduyun')  # 如果没有该元素,则添加,有则不做操作

4.11 字典的遍历

for i in info:      # 字典的循环,i返回字典的索引,速度快,推荐
    print(i, info[i])

for k, v in info.items():        #第二种方法,不推荐
    print(k, v)

5. 购物车实例

product_list = [
    ('iphone', 5800),
    ('mac', 9800),
    ('Bike', 800),
    ('Watch', 10600),
    ('coffee', 31),
    ('alex python', 120),
]
shopping_list = []
salary = input("Input your salary:")
if salary.isdigit():
    salary = int(salary)
    while True:
        for index, item in enumerate(product_list):
            print(index, item)
        user_choice = input("选择要买嘛?>>>:")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(product_list) and user_choice >= 0:
                p_item = product_list[user_choice]
                if p_item[1] <= salary:
                    shopping_list.append(p_item)
                    salary = salary - p_item[1]
                    print("Add %s into shopping cart, your current balance is %d" % (p_item, salary))
                else:
                    print('033[41;lm你的余额只剩下[%s]啦,还没个毛线\033[Om' % salary)
            else:
                print('product code [%s] is not exitst!' % user_choice)
        elif user_choice == 'q':
            print('-------shopping list---------')
            for p in shopping_list:
                print(p)
            print("your current balance:", salary)
            exit()
    else:
        print('invalid option')

6. 三级菜单实例

data = {
    '北京': {
        '昌平': {
            '沙河': ['lodboy', 'test'],
            '天通苑': ['链家地产', '我爱我家'],
        },
        '朝阳': {
            '望京': ['奔驰', '陌陌'],
            '国贸': ['CICC', 'HP'],
            '动直门': ['Advent', '飞信'],
        },
        '海定': {

        },
    },
    '山东': {
        '德州': {},
        '青岛': {},
        '济南': {},
    },
    '广东': {
        '东莞': {},
    }
}

exit_flag = False


while not exit_flag:
    for i in data:
        print(i)
    choice = input('选择进入1>>')
    if choice in data:
        while not exit_flag:
            for i2 in data[choice]:
                print('\t', i2)
            choice2 = input('选择进入2>>')
            if choice2 in data[choice]:
                while not exit_flag:
                    for i3 in data[choice][choice2]:
                        print('\t', i3)
                    choice3 = input('选择进入3>>')
                    if choice3 in data[choice][choice2]:
                        for i4 in data[choice][choice2][choice3]:
                            print('\t\t', i4)
                        choice4 = input('最后一层')
                        if choice4 == 'b':
                            pass    # 什么都不做
                        elif choice4 == 'q':
                            exit_flag = True
                    elif choice3 == 'b':
                        break
                    elif choice3 == 'q':
                        exit_flag = True
            elif choice2 == 'b':
                break
            elif choice2 == 'q':
                exit_flag = True
    elif choice == 'b':
        break
    elif choice == 'q':
        exit_flag = True

 7 文件操作

7.1 文件操作的基本流程

打开文件,得到文件句柄并赋值给一个变量

通过句柄对文件进行操作

关闭文件

# 第一种方法,需要自行关闭文件
f = open('yesterday', 'r+', encoding='utf-8')     
f.close()

# 第二种方法,自动关闭文件,也可以同时打开多个文件
with open('log','r') as f:  

7.2 打开文件的模式

r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读;   不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】从光标所在的位置写入,会覆盖以前的内容,如果想追加,则将光标移动到末尾
w+,写读,写的时候会覆盖原来的所有内容
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注) rb wb ab

7.3 文件函数

f.seek(10)   # 将文件的光标指针定位到参数所在的位置,可以确定位置再写
f.tell()         # 返回当前文件光标指针所在的位置
f.readline()    # 读取一行并返回
f.read(k)        # 指定参数时读取参数数目的内容,指针光标移动,不指定时读取整个文件的内容
f.encoding        # 返回文件的编码方式
f.flush()    # 刷新文件,马上写入,否则会等缓存区满才写入

# 文件按行读取的两种方法:
for index, line in enumerate(f):    # 浪费系统内存的操作
for  line in f:        # 推荐

# 文件修改操作的实例       
f = open('yesterday', 'r', encoding='utf-8')
f_new = open('yesterday2.bak', 'w', encoding='utf-8')

for line in f:
    if '肆意的快乐等我享受' in line:
        line = line.replace('肆意的快乐等我享受', '肆意的快乐等着小镜子去享受')
    f_new.write(line)     

8 字符编码与转码

参考:http://www.cnblogs.com/yuanchenqi/articles/5956943.html

如果py2解释器去执行一个utf8编码的文件,就会以默认地ASCII去解码utf8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf8来解码。而py3的解释器因为默认utf8编码,所以就方便很多了。

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分,不再会对bytes字节串进行自动解码。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

#print('alvin'+u'yuan')#字节串和unicode连接 py2:alvinyuan
print(b'alvin'+'yuan')#字节串和unicode连接 py3:报错 can't concat bytes to str

如果py2解释器去执行一个utf8编码的文件,就会以默认地ASCII去解码utf8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf8来解码。而py3的解释器因为默认utf8编码,所以就方便很多了。

注意:

1. 在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

2. 创建一个txt文件时,win的操作系统安装时是默认的gbk编码,而linux操作系统默认的是utf8编码

 

9. 编码解码的常见问题

1 cmd下的乱码问题

hello.py

1
2
#coding:utf8
print  ( '苑昊' )

文件保存时的编码也为utf8。

思考:为什么在IDE下用2或3执行都没问题,在cmd.exe下3正确,2乱码呢?

      我们在win下的终端即cmd.exe去执行,大家注意,cmd.exe本身也一个软件;当我们python2 hello.py时,python2解释器(默认ASCII编码)去按声明的utf8编码文件,而文件又是utf8保存的,所以没问题;问题出在当我们print'苑昊'时,解释器这边正常执行,也不会报错,只是print的内容会传递给cmd.exe用来显示,而在py2里这个内容就是utf8编码的字节数据,可这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码。

py3正确的原因是传递给cmd的是unicode数据,cmd.exe可以识别内容,所以显示没问题。

明白原理了,修改就有很多方式,比如:

1
print  (u '苑昊' )

改成这样后,cmd下用2也不会有问题了。

2 open()中的编码问题

创建一个hello文本,保存成utf8:

苑昊,你最帅!

同目录下创建一个index.py

f=open('hello')
print(f.read())

为什么 在linux下,结果正常:苑昊,在win下,乱码:鑻戞槉(py3解释器)?

因为你的win的操作系统安装时是默认的gbk编码,而linux操作系统默认的是utf8编码;

当执行open函数时,调用的是操作系统打开文件,操作系统用默认的gbk编码去解码utf8的文件,自然乱码。

解决办法:

f=open('hello',encoding='utf8')
print(f.read())

如果你的文件保存的是gbk编码,在win 下就不用指定encoding了。

另外,如果你的win上不需要指定给操作系统encoding='utf8',那就是你安装时就是默认的utf8编码或者已经通过命令修改成了utf8编码。

注意:open这个函数在py2里和py3中是不同的,py3中有了一个encoding=None参数。

转载于:https://www.cnblogs.com/feng-ying/p/9389922.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值