python之字符串和常用数据结构

第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运算仍然是计算机日常工作中最为重要的事情之一,但是今天的计算机处理得更多的数据都是以文本信息的方式存在的,而Python表示文本信息的方式我们在很早以前就说过了,那就是字符串类型。

使用字符串

我们可以通过下面的代码来了解字符串的使用。

def main():
    str1='hello world'

    #通过len函数计算字符串的长度
    print(len(str1))
    #获取字符串首字母大写的拷贝
    print(str1.capitalize())
    # 获得字符串变大写后的拷贝
    print(str1.upper())
    # 从字符串中查找子串所在位置
    print(str1.find('or'))
    print(str1.find('el'))
    # 检查字符串是否以指定的字符串开头
    print(str1.startswith("he"))
    print(str1.startswith("He"))
    # 检查字符串是否以指定的字符串结尾
    print(str1.endswith('D'))
    # 将字符串以指定的宽度居中并在两侧填充指定的字符
    print(str1.center(50,"*"))
    # 将字符串以指定的宽度靠右放置左侧填充指定的字符
    print(str1.rjust(50,' '))
    str2 = 'abc123456'
    # 从字符串中取出指定位置的字符(下标运算)
    print(str2[2])
    # 字符串切片(从指定的开始索引到指定的结束索引)
    print(str2[2:5])
    print(str2[2:])
    print(str2[2::2])# 对字符串进行切片,从2开始,每隔两个字符切一次 结果为c246
    print(str2[::2])# 对字符串进行切片,从头开始,每隔两个字符切一次 结果为ac246
    print(str2[-3:-1])
    # 检查字符串是否由数字构成
    print(str2.isdigit())
    # 检查字符串是否以数字和字母构成
    print(str2.isalnum())
    str3 = '  [email protected] '
    print(str3)
    # 获得字符串修剪左右两侧空格的拷贝
    print(str3.split())
if __name__ == '__main__':
  main()

除了字符串,Python还内置了多种类型的数据结构,如果要在程序中保存和操作数据,绝大多数时候可以利用现有的数据结构来实现,最常用的包括列表、元组、集合和字典。

使用列表

下面的代码演示了如何定义列表、使用下标访问列表元素以及添加和删除元素的操作。

def main():
    list1=[1,3,5,7,100]
    print (list1)
    list2=['hello']*5
    print(list2)
    # 计算列表长度(元素个数)
    print(len(list2))
    # 下标(索引)运算
    print(list1[0])
    print(list1[4])
    print(list1[-1])
    print(list1[-3])

    list1[2]=300
    print(list1)
    # 添加元素
    list1.append(200)
    list1.insert(1,400)
    list1+=[1000,2000]
    print(list1)
    #删除元素
    list1.remove(3)
    if 200 in list1:
        list1.remove(200)
    del list1[0]
    print list1

if __name__ == '__main__':
  main()

和字符串一样,列表也可以做切片操作,通过切片操作我们可以实现对列表的复制或者将列表中的一部分取出来创建出新的列表,代码如下所示。

def main():
    fruits= ['grape', 'apple', 'strawberry', 'waxberry']
    fruits+= ['pitaya', 'pear', 'mango']
    for fruit in fruits:
        print(fruit.title())


    fruits2=fruits[1:4]
    print(fruits2)
    fruits3 = fruits[:]
    print(fruits3)
    fruits4=fruits[-3:-1]
    print(fruits4)
    # 可以通过反向切片操作来获得倒转后的列表的拷贝
    fruits5=fruits[::-1]
    print(fruits5)

if __name__ == '__main__':
  main()

对列表的排序操作

def main():
    list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
    # sorted函数返回列表排序后的拷贝不会修改传入的列表
    list2=sorted(list1)
    list3 = sorted(list1, reverse=True)
    # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
    list4=sorted(list1,key=len)
    print(list1)
    print(list2)
    print(list3)
    print(list4)
    # 给列表对象发出排序消息直接在列表对象上进行排序
    list1.sort(reverse=True)
    print(list1)

if __name__ == '__main__':
  main()

我们还可以使用列表的生成式语法来创建列表,代码如下所示。

import sys

def main():
    f=[x for x in range(1,10)]
    print(f)
    f=[x+y for x in 'ABCDE' for y in '1234567']
    print(f)
    # 用列表的生成表达式语法创建列表容器
    # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
    f = [x ** 2 for x in range(1,1000)]
    print(sys.getsizeof(f))# 查看对象占用内存的字节数
    print(f)
    # 请注意下面的代码创建的不是一个列表而是一个生成器对象
    # 通过生成器可以获取到数据但它不占用额外的空间存储数据
    # 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
    f=(x**2 for x in range(1,1000))
    print (sys.getsizeof(f))# 相比生成式生成器不占用存储数据的空间
    print(f)
    for val in f:
        print(val)

if __name__ == '__main__':
  main()

使用元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改,在前面的代码中我们已经不止一次使用过元组了。顾名思义,我们把多个元素组合到一起就形成了一个元组,所以它和列表一样可以保存多条数据。下面的代码演示了如何定义和使用元组。

def main():
    t=('张三', 38, True, '某某')
    # 获取元组中的元素
    print(t[0])
    print(t[3])
    # 遍历元组中的值
    for member in t:
        print(member)
    # 变量t重新引用了新的元组原来的元组将被垃圾回收
    t=('王大锤', 20, True, '云南昆明')
    # 将元组转换成列表
    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)
if __name__ == '__main__':
  main()

使用字典

字典是另一种可变容器模型,类似于我们生活中使用的字典,它可以存储任意类型对象,与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。下面的代码演示了如何定义和使用字典。

def main():
    scores = {'张三': 95, '白元芳': 78, '狄仁杰': 82}
    print(scores['张三'])
    print(scores['狄仁杰'])
    # 对字典进行遍历(遍历的其实是键再通过键取对应的值)
    for elem in scores:
        print('%s\t--->\t%d' % (elem, scores[elem]))

    # 更新字典中的元素
    scores['白元芳']=65
    scores['诸葛王朗']=71

    # 删除字典中的元素
    print(scores.popitem())

if __name__ == '__main__':
  main()

强化练习

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

import os
import time

def main():
    content="北京欢迎你为你开天辟地...."
    while True:
        os.system('cls')
        print(content)
        time.sleep(0.2)
        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


tmp=generate_code(code_len=5)
print tmp

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

#计算指定的年月日是这一年的第几天
def is_leap_year(year):
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0

def which_day(year,month,date):
    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(is_leap_year(1980))
    print(which_day(1980,11,28))


if __name__ == '__main__':
    main()

你可能感兴趣的:(python之字符串和常用数据结构)