Python100Days-day7字符串和数据结构

使用字符串
0.字符串是由单引号或双引号包围的由零个或多个字符组成的有限序列
1.以三个单引号或双引号包围的字符串可以分成几行
2.转义符 \ ,\ 后还可以跟八进制数或十六进制数表示字符,
还可以跟Unicode编码来表示字符
3.不希望 \ 表示转义是可以在字符串最前面(引号外面)加上字母 r
4. + 运算符实现字符串的拼接
示例

s1 = 'Hello,'
s2 = '2020'
s1 += s2
print(s1)#Hello,2020

5、 * 运算符实现重复一个字符串的内容
示例

s1 = '20'*2
print(s1)#2020

6、[ ] 与[ : ]运算符进行切片运算

xn = '2020ainiaini'
print(xn[1])#0
print(xn[4:6])#ai
print(xn[4:])#ainiaini
print(xn[::1])#2020ainiaini
print(xn[5::2])#iiii
print(xn[0:3:2])#22

Conclusion:
[x]代表取出字符串的第x位(下标运算);
str[a : b : c]代表从a位开始到b位结束,且取出的步长是c
省略a代表从头开始
省略b代表结尾结束
省略c和其前面的:代表步长为1
步长为负数代表反方向取出
倒数第一位为-1,类推,可以用于a,b
7、用in和not in 判断一个字符串是否包含另一个字符串

xn = '2020ainiaini'
print('aini' in xn)#True
print('2019' not in xn)#True
print('爱你' in xn)#False

8.其他对字符串的处理方法

tr1 = 'hello, world!'
# 通过内置函数len计算字符串的长度
print(len(str1)) # 13
# 获得字符串首字母大写的拷贝
print(str1.capitalize()) # Hello, world!
# 获得字符串每个单词首字母大写的拷贝
print(str1.title()) # Hello, World!
# 获得字符串变大写后的拷贝
print(str1.upper()) # HELLO, WORLD!
# 从字符串中查找子串所在位置
print(str1.find('or')) # 8
print(str1.find('shit')) # -1
# 与find类似但找不到子串时会引发异常
# print(str1.index('or'))
# print(str1.index('shit'))
# 检查字符串是否以指定的字符串开头
print(str1.startswith('He')) # False
print(str1.startswith('hel')) # True
# 检查字符串是否以指定的字符串结尾
print(str1.endswith('!')) # True
# 将字符串以指定的宽度居中并在两侧填充指定的字符
print(str1.center(50, '*'))
# 将字符串以指定的宽度靠右放置左侧填充指定的字符
print(str1.rjust(50, ' '))
str2 = 'abc123456'
# 检查字符串是否由数字构成
print(str2.isdigit())  # False
# 检查字符串是否以字母构成
print(str2.isalpha())  # False
# 检查字符串是否以数字和字母构成
print(str2.isalnum())  # True
str3 = '  [email protected] '
print(str3)
# 获得字符串修剪左右两侧空格之后的拷贝
print(str3.strip())

9.格式化字符串,在字符串前(引号外面)加 f

a, b = 5, 10
print(f'{a} * {b} = {a * b}')

常用的数据结构包括列表,元组,集合和字典

列表

1.上文4,5,6中的运算使用与于list
2.几种遍历举例

# 通过循环用下标遍历列表元素
for index in range(len(list1)):
    print(list1[index])
# 通过for循环遍历列表元素
for elem in list1:
    print(elem)
# 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值
for index, elem in enumerate(list1):
    print(index, elem)

3.添加(append),合并(insert),删除(remove,pop,clear)元素

list1 = [1, 3, 5, 7, 100]
# 添加元素
list1.append(200)
list1.insert(1, 400)
# 合并两个列表
# list1.extend([1000, 2000])
list1 += [1000, 2000]
print(list1) # [1, 400, 3, 5, 7, 100, 200, 1000, 2000]
print(len(list1)) # 9
# 先通过成员运算判断元素是否在列表中,如果存在就删除该元素
if 3 in list1:
	list1.remove(3)
if 1234 in list1:
    list1.remove(1234)
print(list1) # [1, 400, 5, 7, 100, 200, 1000, 2000]
# 从指定的位置删除元素
list1.pop(0)
list1.pop(len(list1) - 1)
print(list1) # [400, 5, 7, 100, 200, 1000]
# 清空列表元素
list1.clear()
print(list1) # []

4.各种排序

list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list2 = sorted(list1)
# 直接用sorted是按字母顺序排序
list3 = sorted(list1, reverse=True)
# 排序后翻转
list4 = sorted(list1, key=len)
# 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
print('list1=',list1)
print('list2=',list2)
print('list3=',list3)
print('list4=',list4)
# 给列表对象发出排序消息直接在列表对象上进行排序
list1.sort(reverse=True)
print('list1=',list1)

5.列表的生成式语法来创建列表
f = [x for x in range(1, 10)]
注意方括号是创建列表
print(f)#[1, 2, 3, 4, 5, 6, 7, 8, 9]

f = [x + y for x in ‘ABCDE’ for y in ‘1234567’]
print(f)#[‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’, ‘A6’, ‘A7’, ‘B1’, ‘B2’, ‘B3’, ‘B4’, ‘B5’, ‘B6’, ‘B7’, ‘C1’, ‘C2’, ‘C3’, ‘C4’, ‘C5’, ‘C6’, ‘C7’, ‘D1’, ‘D2’, ‘D3’, ‘D4’, ‘D5’, ‘D6’, ‘D7’, ‘E1’, ‘E2’, ‘E3’, ‘E4’, ‘E5’, ‘E6’, ‘E7’]

import sys
f = [x ** 2 for x in range(1, 1000)]
print(sys.getsizeof(f)) # 查看对象占用内存的字节数
#9016,占用的内存很大
print(f)#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, …, 994009, 996004, 998001]

6.创建生成器对象
注意圆括号是创建生成器对象
创建的不是一个列表而是一个生成器对象
通过生成器可以获取数据但不占用额外的空间储存数据
每次需要数据时通过内部运算得到数据,需要额外时间
import sys
f = (x ** 2 for x in range(1, 1000))
print(sys.getsizeof(f)) # 相比生成式生成器不占用存储数据的空间
#112,较于生成式占用内存明显更小
print(f)
for val in f:
print(val)
#1
4
9
16
25
36
49
64
81

986049
988036
990025
992016
994009
996004
998001

元组
1.元组的各种操作

# 定义元组
t = ('给雨', 38, True, '四川成都')
print(t)
# 获取元组中的元素
print(t[0])
print(t[3])
# 遍历元组中的值
for member in t:
    print(member)
# 重新给元组赋值
# t[0] = '王大锤'  # TypeError
# 变量t重新引用了新的元组原来的元组将被垃圾回收
t = ('王大锤', 20, True, '云南昆明')
print(t)
# 将元组转换成列表
person = list(t)
print(person)
# 列表是可以修改它的元素的
person[0] = '李小龙'
person[1] = 25
print(person)
# 将列表转换成元组
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list)
print(fruits_tuple)

2.特点
元组用圆括号,列表用方括号
元组的元素无法修改
元组在创建时间和占用空间上优于列表

集合
1.特点
集合使用花括号
和数学意义上的集合一致,无重复元素,无序,可以进行交,并,补运算
2.创建集合的字面量语法
set1 = {1, 2, 3, 3, 3, 2}
print(set1) # {1, 2, 3}
print(‘Length =’, len(set1)) # Length = 3
3.创建集合的构造器语法
set2 = set(range(1, 10))
set3 = set((1, 2, 3, 3, 2, 1))
print(set2, set3)
#{1, 2, 3, 4, 5, 6, 7, 8, 9} {1, 2, 3}
4.创建集合的推导式语法
set4 = {num for num in range(1, 100) if num % 3 == 0 and num % 5 == 0}
print(set4) # {75, 45, 15, 90, 60, 30}
5.添加元素
添加一个使用add
添加多个使用update,且要加方括号
set4 = {num for num in range(1, 100) if num % 3 == 0 and num % 5 == 0}
set4.add(66)
print(set4) # {66, 75, 45, 15, 90, 60, 30}
set4.update([66,99])
print(set4) # {66, 99, 75, 45, 15, 90, 60, 30}
6.删除元素
discard(丢弃)和remove效果相同
集合中没有该元素,remove会报错而discard不会
pop会只留下集合的一个数,而且takes no arguments,它不需要参数
print(set4.pop()) # 75
7.集合成员之间的交并补运算

set1 = {10,24,66,88}
set2 = {5,20,24,99}
set3 = {1,2,0,20,22,33}
# 集合的交集、并集、差集、对称差运算
print(set1 & set2) # {24}
# print(set1.intersection(set2))
print(set1 | set2) # {66,99,5,10,20,24,88}
# print(set1.union(set2))
print(set1 - set2) # {88,10,66}
# print(set1.difference(set2))
print(set1 ^ set2) # {66,99,5,10,220,88}
# print(set1.symmetric_difference(set2))
# 判断子集和超集
print(set2 <= set1) # False
print(set2.issubset(set1))
print(set3 <= set1) # False
print(set3.issubset(set1))
print(set1 <= set2) # False
print(set1.issuperset(set2))
print(set1 <= set3) # False
print(set1.issuperset(set3))

字典

# 创建字典的字面量语法
scores = {'给雨': 95, '白元芳': 78, '狄仁杰': 82}
print(scores)
# 创建字典的构造器语法
items1 = dict(one=1, two=2, three=3, four=4)
# 通过zip函数将两个序列压成字典
items2 = dict(zip(['a', 'b', 'c'], '123'))
# 创建字典的推导式语法
items3 = {num: num ** 2 for num in range(1, 10)}
print(items1, items2, items3)
# 通过键可以获取字典中对应的值
print(scores['给雨'])
print(scores['狄仁杰'])
# 对字典中所有键值对进行遍历
for key in scores:
    print(f'{key}: {scores[key]}')
# 更新字典中的元素
scores['白元芳'] = 65
scores['诸葛王朗'] = 71
scores.update(冷面=67, 方启鹤=85)
print(scores)
if '武则天' in scores:
    print(scores['武则天'])
print(scores.get('武则天'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('武则天', 60))
# 删除字典中的元素
print(scores.popitem())
print(scores.popitem())
print(scores.pop('给雨', 100))
# 清空字典
scores.clear()
print(scores)

练习
练习1:在屏幕上显示跑马灯文字

import os
import time

def main():
    content = '我也不知道该说些什么'
    while True:
        # 清理屏幕上的输出
        os.system('cls') # clear可缩写为cls
        print(content)
        # 休眠时长
        time.sleep(0.1)
        content = content[1:] + content[0]

if __name__ == '__main__':
    main()

练习2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成

import random


def generate_code(code_len=4):
    """
    生成指定长度的验证码

    :param code_len: 验证码的长度(默认4个字符)

    :return: 由大小写英文字母和数字构成的随机验证码
    """
    all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_chars) - 1
    code = ''
    for _ in range(code_len):
        index = random.randint(0, last_pos)
        code += all_chars[index]
    return code

练习3:设计一个函数返回给定文件名的后缀名

def get_suffix(filename, has_dot=False):
    """
    获取文件名的后缀名

    :param filename: 文件名
    :param has_dot: 返回的后缀名是否需要带点
    :return: 文件的后缀名
    """
    pos = filename.rfind('.')
    if 0 < pos < len(filename) - 1:
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''

练习4:设计一个函数返回传入的列表中最大和第二大的元素的值

def max2(x):
    m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for index in range(2, len(x)):
        if x[index] > m1:
            m2 = m1
            m1 = x[index]
        elif x[index] > m2:
            m2 = x[index]
    return m1, m2

练习5:计算指定的年月日是这一年的第几天

def is_leap_year(year):
    """
    判断指定的年份是不是闰年

    :param year: 年份
    :return: 闰年返回True平年返回False
    """
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0


def which_day(year, month, date):
    """
    计算传入的日期是这一年的第几天

    :param year: 年
    :param month: 月
    :param date: 日
    :return: 第几天
    """
    days_of_month = [
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    ][is_leap_year(year)]
    total = 0
    for index in range(month - 1):
        total += days_of_month[index]
    return total + date


def main():
    print(which_day(1980, 11, 28))
    print(which_day(1981, 12, 31))
    print(which_day(2018, 1, 1))
    print(which_day(2016, 3, 1))


if __name__ == '__main__':
    main()

练习6:打印杨辉三角

def main():
    num = int(input('Number of rows: '))
    yh = [[]] * num
    for row in range(len(yh)):
        yh[row] = [None] * (row + 1)
        for col in range(len(yh[row])):
            if col == 0 or col == row:
                yh[row][col] = 1
            else:
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print(yh[row][col], end='\t')
        print()


if __name__ == '__main__':
    main()
发布了18 篇原创文章 · 获赞 0 · 访问量 302

猜你喜欢

转载自blog.csdn.net/RainGiving/article/details/104004366