字符串和常用的数据结构

使用字符串

def main():
    # 不变字符串
    str1 = 'hello,world'
    print(len(str1))  # 得到字符串的长度
    print(str1.upper())  # 获得字符串首字母大写
    print(str1.startswith('he'))  # 检查字符串是否以指定的字符串开头
    print(str1.endswith('d'))  # 检查字符串是否以指定的字符串结尾
    print(str1.center(50, '*'))  # 将字符串以指定的宽度居中并在两侧填充指定的字符
    print(str1.rjust(50, ' '))  # 将字符串以指定的宽度靠右放置左侧填充指定的字符

    str2 = 'abc123456'
    print(str2[2])  # c
    print(str2[2:5])  # c12
    print(str2[-1:-3:-1])  # 65
    print(str2.isdecimal())  # 全是数字   False
    print(str2.isalpha())  # 全是字母     False
    print(str2.isalnum())  # 字母和数字   True 

    str3 = '  ljl  '
    print(str3)           #   ljl
    print(str3.strip())   # ljl

Python中存储数据结构的除了字符串还有:列表,元组,集合,字典

列表

下面演示了列表的定义,添加,删除和访问:

 def main():
    list1 = [10, 20, 30, 40, 50]
    print(list1)
    list2 = ['ljl'] * 5
    print(list2)
    print(len(list1))  # 计算列表长度(元素个数)
    print(list1[0]) # 下标(索引)运算 索引的范围是[0,n-1]
    print(list1[4])
    print(list1[-1]) # 得到最后一个值

    list1[2] = 300
    print(list1)
    list1.append(200) # 添加元素,添加到列表最后
    list1.insert(1, 400) # 在指定位置添加元素
    list1 += [1, 2] #添加列表
    print(list1)
    print(len(list1))
    list1.remove(3) # 删除列表中3这个元素
    if 1in list1:
        list1.remove(1)
    del list1[0]
    print(list1)
    # 清空列表元素
    list1.clear()
    print(list1)


if __name__ == '__main__':
    main()

列表也可以做切片:

def main():
    list1=['ljl', 'zy', 'haha']
    list1 += ['apple', 'orange']
    for val in list1:
        print(val, end=' ')
    # 列表切片
    list2 = [1, 2, 3, 4]
    list3 = list2[1:3]
    print(list3)

    list4 = list2[:]
    print(list4)

    # 当然我们也可以设置切片的步长
    list5 = list2[::2]


if __name__ == '__main__':
    main()

列表的一系列操作:

def main():
    f = ['a', 'b', 'd', 'c', 's', 'f', 'g']
    # python内置的排序方法默认都是升序排序(从小到大)
    # 如果希望排列成降序(从大到小)可以通过reverse参数来指定
    # Python中的函数几乎都是没有副作用的函数
    # 调用函数之后不会影响传入的参数
    f2 = sorted(f, reverse=True)  # 函数
    print(f)
    print(f2)
    f.sort(reverse=True)  # 改变f的自身 当resverse = True时候则会倒序
    print(f)
    f.sort()  # 会改变本f自身进行排序
    print(f)

if __name__ == '__main__':
    main()

列表可以使用生成式语法来生成一个列表:

def main():
    f = [x + y for x in 'ABCD' for y in '1234567']
    print(f)
    f = list(range(1, 10))
    print(f)
    f = [x for x in range(1, 10)]
    print(f)
    # 用列表的生成表达式创建列表容器
    # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
    f = [x ** 2 for x in range(1, 10)]
    print(f)
    print(sys.getsizeof(f))

    # 列表生成器 这里得到的不是一个列表  而是一个生成器对象
    # 通过生成器可以获取到数据  它不占用额外的空间储存数据
    # 每次需要数据的时候就通过生成器获取数据  当然这需要花费时间
    f = (x ** 2 for x in range(1, 10))
    print(sys.getsizeof(f))
    for val in f:
        print(val, end=' ')


if __name__ == '__main__':
    main()

除了上面的生成器语法之外,我们还可以在函数之中定义,使用关键字yield并且函数中的return关键字应当移除:
斐波拉契数列

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a,b = b, a+b
        yield a


if __name__ == '__main__':
    for val in fib(10):
        print(val, end=' ')
"""
运行结果:1 1 2 3 5 8 13 21 34 55 
"""

元组

元组和列表比较相似,只不过元组里面的元素是不可以更改的而且元组在创建的时间和储存的空间上都优于列表:

def main():
    tuple1 = (1, 1, 2, 2, 3, 3)   # 定义一个元组
    print(tuple1)  #  打印出整个元组
    for val in tuple1:
        print(val, end=' ')  # 遍历的到元组中的值
    # 不可以使用索引号给元组中的元素赋值 但是可以将元组全部重新定义
    tuple1 = (2, 1, 2, 2, 3, 3)
    print(tuple1)

    # 可以将元组转化成列表
    list1 = list(tuple1)
    print(list1)
    # 列表是可以修改它之中的每一个元素
    list1[0] = 5
    print(list1)
    # 相对应的 列表也可以转化成元组
    tuple2 = tuple(list1)
    print(tuple2)


if __name__ == '__main__':
    main()

集合

Python中的集合和数学上的集合是一样的,不允许有重复的数据出现,而且也有交集、并集、差集。

def main():
    # 定义一个集合
    set1 = {1, 1, 2, 2, 3, 3}
    print(set1) 
    set1.add(4)
    set1.add(5)
    set2 = {1, 3, 5, 7, 9}
    
    set3 = set1.intersection(set2) # set3 = set1 & set2 交集运算
    print(set3)

    set3 = set1.union(set2)  # set3 = set1 | set2  并集运算
    print(set3)

    set3 = set1.difference(set2)  # set3 = set1 - set2  差集运算
    print(set3)

    set3 = set2.difference(set1)
    print(set3)

    set3 = set1.symmetric_difference(set2)  # set3 = set1 ^ set2  对称差运算
    print(set3)
    # 集合是没有顺序的 所以不能用索引序号
    for val in set2:
        print(val)
    set4 = {1, 2, 10}
    print(set4.issubset(set1))  # 子集 set4 <= set1
    print(set1.issuperset(set4))  # 超集  set1 >= set4
    print(set1.pop())  # 随机删除集合里面的元素
    print(set1)
    set1.remove(2)
    print(set1)
    print(set1)


if __name__ == '__main__':
    main()

字典

字典可以储存任意一个数据,字典里面的元素是一个键和一个值组成(键值对),键和值用冒号隔开。

def main():
    dict1 = {'name': '刘家洛', 'age': 24, 'gender': True}
    print(dict1['name'])
    print(dict1['age'])
    print(dict1['gender'])

    dict1['name'] = 'ljl'
    del dict1['gender']  # 删掉其中的元素
    # 字典的遍历其实就是通过字典的键取到对应的值
    for x in dict1:
        print(x,'---->', dict1[x])

    # 更新字典中的元素
    dict1['name'] = 'ljl'
    dict1['age'] = '23'
    print(dict1)
    dict1.update(age=10) # 直接更新字典中键对应的值
    print(dict1)
    # get 方法 通过键来获取相应的值,如果没有该键则第二个参数就是其默认值
    print(dict1.get('zy', 10))
    print(dict1.get('name', 10))

    # 删除字典中的元素
    # dict1.popitem()  # 删掉字典中的所有元素
    print(dict1.pop('name')) # 删掉字典中的key=name的元素
    print(dict1)

    # 清空字典
    dict1.clear()
    print(dict1)
    # dict1.setdefault('motto','成年人的世界里没有容易二字')


if __name__ == '__main__':
    main()

练习题

1.文件后缀名生成

# 给你一个文件名取出文件的后缀名


def file_suffix(file, has_dot=False):
    """
    得到文件后缀名
    :param file: 文件名
    :param has_dot: 后缀是否带点(.)
    :return: 文件后缀名
    """
    pos = file.rfind('.')
    if 0 < pos < len(file) - 1:
        index = pos if has_dot else pos + 1
        return '文件的后缀名是:'+file[index:]
    else:
        return ''


if __name__ == '__main__':
    my_file = input('请输入一个文件名:')
    print(file_suffix(my_file))
    print(file_suffix(my_file, True))

2.指定某天计算出改天是当年的第几天

# 设计一个函数传入年月日返回这一天是这一年的第几天
def is_today(y, m, d):
    num = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    total = 0
    for x in range(m-1):
        total += num[x]
    if y % 400 == 0 or (y % 4 == 0 and y % 100 != 0):
        if m > 2:
            total += 1
    return total + d


def main():
    year = int(input('year = '))
    month = int(input('month = '))
    day = int(input('day = '))
    print(is_today(year, month, day))


if __name__ == '__main__':
    main()

3.杨辉三角

def yhsn(num):
    list1 = [[1], [1, 1]]
    for x in range(2, num):
        list2 = [1]
        for y in range(x - 1):
            list2.append(list1[x-1][y]+list1[x-1][y+1])
        list2.append(1)
        list1.append(list2)
    return list1


if __name__ == '__main__':
    n = int(input('请输入杨辉三角的行数:'))
    print(yhsn(n))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容