联系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 | |
continue | global | raise |
def | if | return |
del | import | try |
elif | in | while |
else | is | with |
except | lambda | yield |
序列类型通用操作符和函数
操作符 | 描述 |
---|---|
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这个操作?
- 如何创建一个集合呢?如何创建一个字典呢?
- 创建了集合怎么在里面添加元素呢?