Python教程(三):复杂数据类型

联系QQ:970586718

博客地址:https://blog.csdn.net/m0_46521785

补充知识

continue与break

  • continue是结束本轮循环,不再执行本轮循环的循环体后面的代码,继续执行下一轮循环
  • break是结束整个循环
for i in range(3):
    if i==1:
        continue
    print(i,666)
print('###########################')
for i in range(3):
    if i==1:
        break
    print(i,777)

考试的时候经常这么描述:break用来跳出最内层循环,脱离循环后程序从循环代码后继续执行。【这句话是对的】

break只能跳出最内层的循环,也就是说它只能结束离它最近的循环结构,为什么说最近呢?因为循环也可以嵌套呀,看看下面的例子就明白了

for i in range(3):
    for j in range(3):
        if j==1:
            break
        print('i=%d,j=%d'%(i,j))

那如果想跳出外面一层怎么办呢可以使用创建flag的方式,什么叫创建flag,他就是创建一个条件,根据条件状态来判断后面该怎么编写代码,这个作用只可意会

flag = 1
for i in range(3):
    if not flag:  # 这么写为什么是对的呢?起到的作用和 if flag==0 一样吗?
        break
    for j in range(3):
        if j==1:
            flag = 0
            break
        print('i=%d,j=%d'%(i,j))

三元表达式

x = a if xxx else b
# 实例
a = 'hzau'
x = len(a) if len(a)>3 else a

命名规范

  • 不要起和内置函数同名的变量或者函数,不能起和保留字同名的变量

    sum = 1  # sum是内置函数,可以这么起名字但是不推荐
    and = 1  # and是保留字,这么起名直接报错
    # 屡试不爽法:考试的时候问你啥,你就敲代码试试对不对
    

    Python3内置函数:https://www.runoob.com/python3/python3-built-in-functions.html

  • 只能以下划线和字母开头,后面可以混合搭配,不要以数字开头

    a = 1
    _a = 1
    ls1 = [1]
    ls_1_a = [1]
    1a = 1  # 这样写不可以的
    
  • 大小写敏感

  • 起的名字尽量要方便辨识,例如ls就比a辨识度高

保留字

and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield

Python教程(三):复杂数据类型

序列类型通用操作符和函数


操作符 描述
x in s 如果x是s的元素,返回True,否则返回False
x not in s 如果x不是s的元素,返回True,否则返回False
s + t 连接 s 和 t
s * n 或 n * s 将序列 s 复制 n 次
s[i] 索引,返回序列第 i - 1个元素
s[i : j] 切片,不包括第 j 位元素
s[i : j : k] 步骤切片,k表示步长,不写默认为1
len(s) 序列 s 的长度
min(s) 序列 s 的最小元素
max(s) 序列 s 的最大元素
sum(s) 序列 s 的求和(列表只含数字)
s.index(x) 序列 s 中从左往右第一次出现 x 的索引
s.rindex(x) 序列 s 中从右往左第一次出现 x 的索引
s.count(x) 序列 s 中出现 x 的总次数

列表

常用方法

所有方法的存在都是为了解决问题,否则它将毫无意义,当你遇到问题,一定会有对应的解决方法

  • 创建一个列表
  • 索引与切片
  • 更新元素
  • append
  • join
  • sort与sorted,康康官方文档
  • reverse
  • copy
  • sum、len、max、min
  • insert、copy、ls.remove(x)、del ls[i]、ls.pop(x)
  • zip,两个可迭代对象长度不相等的话就匹配到最短的位置

列表推导式(不建议写双重循环)

  • 用来转化数据

  • 简化代码

  • 使用方式

    a = '1234'
    ls_a = [i for i in a]
    
    b = ['google','baidu','alibaba','zrl']
    ls_b1 = [i for i in b if len(i)>5]
    ls_b2 = [i if len(a)>3 else i.upper() for i in b]
    

map的使用

a = '1234'
b = list(map(int,a))  # map的第一个参数是你想抓转化的类型,第二个参数是可迭代对象
print(b)

温度转化程序谈列表

【问题描述】在温度刻画的不同体系中,摄氏度以1标准大气压下水的结冰点为0度,沸点为100度。华氏度以1标准大气压下水的结冰点为32度,沸点为212度。如何利用程序辅助进行摄氏度和华氏度之间的转换,结果保留1位小数。

设计算法:根据华氏和摄氏温度定义,其单位刻度对应温度关系为(212-32)/(100-0)=1.8,转换公式如下:

  C = ( F – 32 ) / 1.8

  F = C * 1.8 + 32

【输入形式】输入温度加温度制式的代表字母,摄氏温度对应字符是c或C,华氏温度对应字符是f或F
【输出形式】转换后的温度加温度制式的代表字母
【样例输入输出1】

What is the temperature?82F

The converted temperature is 27.8C

【样例输入输出2】

What is the temperature?28C

The converted temperature is 82.4F

为了解决这个问题,我那天查资料到凌晨四点,因为我第二天要给别人讲。。。

#Temperature
val=input("What is the temperature?")
if val[-1] in ["C","c"]:      #①这里的冒号有什么用?   ②为什么这一行写val[0:-1]就不对?
    f=1.8*float(val[0:-1])+32  
    print("The converted temperature is {:.1f}F".format(f))
elif val[-1] in ["F","f"]:
    c=(float(val[0:-1])-32)/1.8   #为什么这一行写val[-1]就不对?
    print("The converted temperature is {:.1f}C".format(c))
else:
    print("Input error!")

注意的地方

  • 字符串转为列表
  • sort导致列表变成了None

练习题

  • 输入串数字,使用空格分隔,求其中的最大值、最小值、平均值

  • 输出斐波拉契数列-上机考试题

    定义一个函数fib,给定n,返回n以内的斐波那契数列。
    【输入形式】:输入大于3的整数值
    【输出形式】:一行输出指定数以内的斐波拉契数列,用逗号分隔
    【样例输入】
    input a number please:200
    【样例输出】
    1,1,2,3,5,8,13,21,34,55,89,144,
    

元组与集合(不做重点)

元组基本用不到,因为列表更好用,知道有这么个东西就好

集合出现多数是用来去除重复元素的

元组

格式:

a = (1,2,3,4)

特点:

  • 长的样子和列表相似,用小括号包裹
  • 是有序数据结构,元组不可修改,但是可以使用加法拼接

常用方法:

  • 创建一个元组

    # 方法一:实例化
    a = tuple()
    # 方法二:用逗号分开
    b = 1,2
    # 方法三:由其他类型转化来
    ls = [1,2]
    c = tuple(ls)
    
  • 索引与切片

集合

特点:

  • 确定性:

  • 互异性:没有重复的元素

    myset = set()
    for i in [1, 98, 98, 98, 98, 98, 98,]:
        myset.add(i)
    print(myset)
    
  • 无序性:先添加进来的不一定在前面

    myset = set()
    for i in [1, 98, 3, 99, 5, 8, 12, 77, -2]:
        myset.add(i)
    print(myset)
    

集合有自己的集合运算,求交集啊,并集啊,补集啊等等,

平时也用不到,想学习的自行探索,用的最多的就是去重

list1=[5,1,9,7,9,9,2]
list1=list(set(list1))
print(list1)  #得到[1, 2, 3, 5, 7, 9]

注:通常情况下使用set内置函数进行强制转化,我们想单独创建一个集合需要这样写

myset = set()
myset.add(111)

练习题

  • 判断是否存在重复元素

    第一行输入元素个数,第二行输入元素,用空格分开,存在重复元素请输入YES,反之输出NO
    

字典

格式

dict1={'张瑞龙':'帅','刘浩':'丑'}

字典里的元素由键值对构成,键(key)就是冒号左侧的值,值(value)就是冒号右面的数值

列表和字典类型的数据不能作为字典的键,因为key 是不能变的,但是列表和字典的值是可以变化的,一旦变化,就再也找不到value 了,但是值可以是任意类型

常用函数

函数 描述
dict1 = {} 创建一个字典
dict1[key]=value 在字典中添加元素,如果key存在,则覆盖原来对应的值
list(dict1.keys()) 得到字典所有键的列表
list(dict1.values()) 得到字典所有值的列表
list(dict1.items()) 得到字典所有元组类型键,值的列表
dict1.get(key,default) 如果键存在则返回对应的值,不存在则赋值为default
del dict1[key] 删除这个键值对
key in dict1 如果键在字典中则返回True,否则为False

统计次数

法一:

list1=[1,1,1,2,5,3,3,10,5,6,8,9,9,11]
dict1={}  #创建一个空字典
for i in list1:
    if i in dict1:  # 如果字典中有键为i
        dict1[i]+=1  # 对应的值加一
    else:  # 如果字典中没有键为i
        dict1[i]=1  # 创建键值对,值为1,因为这是第一次出现
print(dict1)

法二:

list1=[1,1,1,2,5,3,3,10,5,6,8,9,9,11]
dict1={}  #创建一个空字典
for i in list1:
    dict1[i]=dict1.get(i,0)+1  # dict1.get(i,0)表示如果有键为i则返回对应的值,否则返回0
print(dict1)

字典的排序

mylist=list(dict1.items())
# 当写成mylist.sort(key=lambda x:(x[1],x[0]))是根据值从小到大排序
# 当写成mylist.sort()是根据键从小到大排序
print(mylist)  # 在此处可以直接根据需求进行其他操作,而不一定要转为字典
dict1=dict(mylist)  # 将列表转为字典
print(dict1)

排序的时候也可以写成mylist.sort(key=lambda x:(-x[1],x[0])),这个是万能的,reverse能做的他也可以做,但是反之不行吗,不过多讲解,也不是很常用,欢迎和我探讨。

字典推导式

a = list('hzau')
b = list(range(len(a)))
mydict_1 = {i:j for i,j in zip(b,a)}
print(mydict_1)
mydict_2 = {i:j for i in b for j in a}  # 这么写是错误的,可以思考一下为什么错
print(mydict_2)

练习题

  • 出现最多次的整数

    给定n个整数,请统计出每个整数出现的次数,输出出现次数最多的数字以及次数,如果两个数字出现次数相同则先输出较小的那个数。
    _ = input()
    a = input().split()
    # 转化为数值
    a = [eval(i) for i in a]
    # 创建字典统计次数
    mydict = {}
    # 做循环统计次数
    for i in a:
        mydict[i] = mydict.get(i,0)+1
    # 得到最多次数
    max_times = max(mydict.values())
    # 将键值对转化为列表,里面的元素是键值对的元组类型
    data = list(mydict.items())
    # 对数据进行排序,排序规则没有指定,默认是对元组的第一个元素从小到大排序
    data.sort()
    # 输出数据
    for i in data:
        # 判断次数是不是最多的那个
        if i[1] == max_times:
            print(i[0],i[1])
    

思考问题

  • 你能不能用两个列表实现字典的功能呢?
  • set经常用来做什么?
  • 使用列表的sort方法得到了None最大的可能是因为什么?
  • 是不是只有列表才能使用sort这个操作?
  • 如何创建一个集合呢?如何创建一个字典呢?
  • 创建了集合怎么在里面添加元素呢?
上一篇:Python数据结构之字典


下一篇:记录电子竞技游戏jesp中的传输过程公式