一些Python的知识点,和基础题目,到字典,本人使用的工具为Pycharm2021社区版,前面都是一些基础问题,然后我在解决问题的同时也可能会扩展一些知识,都是一些比较基础的东西,由浅入深。
001 关于变量更新
a = 2
a = 4
a = 6
print(a + a + a)
提示:Python是从上到下读取和执行代码的
答案当然不是12了,解释一下,首先Python中的变量赋值有点类似于C语言当中的指针,它首先把a指向了2的存储地址,所以刚开始等于2,然后又指向了4,a的值有变成4,同理最后变成了6,所以最后的结果就是:
18
002 变量名规则
看如下代码会有什么错误?
a = 1
_a = 2
_a2 = 3
2a = 4
这题主要考察变量如何命名,首先Python的变量由数字,字母和下划线组成,而且要以字母或者下划线开头而不能以数字开头,不能使用关键字和函数来当变量,Python变量是区分大小写的,下面就是运行代码的错误提示,invalid syntax就是语法错误,因为2a是以数字开头。
File "D:/Pycharmproject/P_100个编程实例.py", line 4
2a = 4
^
SyntaxError: invalid syntax
003 比较与赋值
执行下面代码,你会发现什么错误?
a = 1
b = 2
print(a == b)
print(b == c)
当然很简单,会报错说,变量c没有被定义,这就好比你们正在干活突然就过来一个陌生人,说要帮你干活,你信的过吗,所以说,变量需要先被声明定义,才能被使用,看一下错误代码。
Traceback (most recent call last):
File "D:/Pycharmproject/P_100个编程实例.py", line 4, in <module>
print(b == c)
NameError: name 'c' is not defined
False
能看懂代码错在哪里很重要,能够让你更快的去修改代码!
004 类型错误
a = 1
b = "2"
print(a + b)
这是一道很基础的错误,相信不管学过哪种语言基础的人都能看的出来,数字与字符串是不能相加的,因为类型不一样,所以如何不更改前两行改正过来呢,那就是需要使用两个转换函数了,我们来看代码。
a = 1
b = "2"
print(int(b) + a)
print(str(a) + b)
int()函数可以把字符串转换成数字,当然字符串里面要是数字。
str()函数可以把数字变成字符串。
看结果:
3
12
第二个结果是12,是为什么,因为字符串相加结果是连接在一起,当然Python中的字符串是不能相减的
005 缩进错误
for letter in 'hello':
if letter == 'e':
print(letter)
运行提示错误:
IndentationError: expected an indented block
看题目就知道就是缩进的错误,我们学别的语言的时候可能缩进差那么一点半点也没什么关系,但是Python就不一样了,可以说的上缩进是Python的半条命了,这么说可能会很夸张,我只想表达缩进对于Python很重要。
欧克,我们解释一下上面错误的原因,if判断语句下面的控制体,需要增加一个缩进,相同等级的语句可以在同一个缩进下。
注意!缩进可以是两个空格,四个空格,tab键都可以,但是单个文件必须前后一致
改完之后代码:
for letter in 'hello':
if letter == 'e':
print(letter)
下面讲个小技巧,可以更改缩进配置。
图1
在Pycharm右下角点击四个空格,点击为Python配置缩进,可以进行更改。
006 不正确的结束
下面代码会报错,错在哪里,如何修改?
print(type("hey".replace("ey","i")[-1])
我们先来看一下报错:
SyntaxError: unexpected EOF while parsing
这是什么意思呢,简单来说就是发现了不正确的文件内容结尾,在我们的代码中如果你仔细观察就会发现,它结尾少了一个括号,所以报了非正常结束EOF错误
007 关键字错误
寻找下面代码的错误
pass = input("please enter your password:")
看样子似乎好像没有错误对吧,但事实上它会报错为语法错误,这是因为pass是Python保留的关键字,所以不能当作变量名你可以改成pass1,pass_s等等
列举一下常见的Python关键字,在Pycharm中运行下列代码:
print(help("keywords"))
输出为:
008 名字未定义
修改下列代码,使之正确输出3
print(math.sqrt(9))
当你输入上面代码的时候,会显示:
NameError: name 'math' is not defined
这是因为math是Python的内置模块,但是不会自动引入,你只需要在开头使用import math就欧克
import math
print(math.sqrt(9))
这里提一大嘴,如果不是内置模块(库/包)怎么办,那就要进行下载,我们这里说的都是Pycharm中的方法。
常用的办法就是在终端输入:pip install xxxx(你想下载的模块名)
我这已经下载过了,所以显示已经安装过
还有种方法,直接搜索,废话不多说,直接看图:
我这把字体改成了中文,如果没改的话应该是setting
然后找到你的项目,点击Python解释器,点击+号进行搜索
然后点击安装就ok了
009 序列索引
输出结果是什么?
letters = ["a","b","c","d"]
print(letters[1])
这个代码输出结果是a吗?
答案是否定的结果是b,因为列表中的下表是从零开始的,使用下表可以访问对应位置元素。
010 序列切片
输入子序列包含b,c,d
letters = ["a","b","c","d"]
直接看答案,没什么好说的,记住就ok
print(letter[1:4]
注意一下这里[1:4]是左开右闭的,就是1-3,包括1,2,3但是不包括4
011 序列前位置切片
输出前三个元素的子序列,用一种更简写的方法
letters = ["a","b","c","d"]
可以这么写
print(letters[:3])
这里[:3]也就相当于[0:3]
012 负数索引
使用负数索引,输出字母c,我们还用上面的letters。
怎么个负数索引法呢,通俗的来讲就是,从前往后数就是0,1,2,3...。从后往前数就是-1,-2,-3...
所以我们要输出字母c就可以:
print(letters[-2])
013 负数切片
得到最后三个元素,我们的例子比较短,如果是比较长的列表,用负数索引是很方便的,所以如果使用负数索引代码是:
print(letters[-3:])
意思呢就是下标为-3的元素到最后一个元素
014 序列索引步长
letters = ["a","b","c","d","e","f","g","h","i"]
如何获得切片,包含:a,c,,e,g,i元素
这就要用到切片步长语法,所以这样写:
print(letters[::2]
[start:end:step],[开始位置:结束位置:步长]
如果step位置不写参数,默认是1.
[:]意思是整个列表,所以代码中[::2]的意思就是,输出从开始到结尾,步长为2的元素
015 range函数
使用函数生成如下列表:
[1,2,3,4,5,6,7,8,9,10]
提示:使用range函数
欧克,代码是:
a = range(1,11)
print(list(a))
range是Python的内置函数,可以生成数字序列,range函数生成的是一个range对象,不是Python的list,所以需要使用list()函数,把range对象转化成list对象
016 range和推导式
完成如下代码
a = range(1,11)
你需要使用a变量完成,最总产生如下输出:
[10,20,30,40,50,60,70,80,90,100]
提示使用列表推导式完成:
a = range(1,11)
print([x * 10 for x in a])
列表推导式用于快速生成一个列表,形如:[x*2 for x in list if x>3]
017 range字符串
a = range(1,11)
需要输入为:
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
提示使用列表推导式:
举一反三,所以方法就是:
print([str(x) for x in a])
018 移除重复元素
完成代码,移除列表中的重复值
a = ["1",1,"1",2]
最终产生如下输出
["1",2,1]
提示:Python中的set是没有重复元素的,可以借助set和list两个函数完成
两种方法:
第一种:
a = ["1",1,"1",2]
a = list(set(a))
print(a)
set函数可以把list变成set达到去重效果,对于set可以用list函数从新变回列表,这个办法有点问题,可能会改变元素顺序,因为set里面的元素是不固定的。
第二种:
a = ["1",1,"1",2]
b = []
for i in a:
if i in a:
if i not in b:
b.append(i)
print(b)
这个办法可以保持元素的顺序,问题在于这个方法效率不高,对于每一个a的元素都要判断是不是在b列表,如果列表很大花费时间很长。
019 列表的排序
list1 = [20,40,30,50,10]
# 希望最终产生如下
# lsit1 is [50,20,30,20,10]
提示:list.sort即可排序
答案:
list1 = [20,40,30,50,10]
list1.sort(reverse=True)
print("list1 is",list1)
list.sort可以实现排序,默认是升序,如果想要降序,加一个参数reverse=True
020,简单字典
创建一个字典,字典的key是a和b,字典的value是1和2
提示:两个方法,用大括号语法和dict函数
答案
dict1 = {"a":1,"b":2}
print(dict1)
dict2 = dict(a = 1,b = 2)
print(dict2)
dict是一个函数,可以用key=value方法进行,这时候a和b不用写成字符串的形式
021 访问字典元素
字典使用key来访问对应的value
这都是要记住的直接上代码:
d = {"a":1,"b":2}
print(d["b"])
022 字典元素加和
完成如下代码,计算key为a和b的值的加和,最终输入数字为3
直接访问value的值就ok了
d = {"a":1,"b":2}
print(d["b"]+d["a"])
023 字典KeyError
如下代码会报错
d = {"小明":"男","小红":"女"}
print(d["男"])
这是因为什么呢,这是因为这个是靠key去访问的,而你放进去的是一个value,所以会报错。
023 添加字典key
给如下代码新增一对key:value,key是c,value是3
提示:典是无序的,如果输出的c在b前面,不用管它。
答案:
d = {"a":1,"b":2}
d["c"]=3
print(d)
025 对字典使用函数
计算如下字典的所有value的数字之和
代码:
d = {'a': 1, 'b': 2, 'c': 3}
print(sum(d.values()))
d.values()返回一个类似于list的dict_values对象
sum()函数可以直接对dict_values对象求和
026 字典过滤
移除如下字典中所有value大于1的key:value对
d = {'a': 1, 'b': 2, 'c': 3}
过滤后应该有如下输出
{'a':1}
提示:可以使用字典推导式,使用d.item可以访问每个key:value对
答案:
d = {'a': 1, 'b': 2, 'c': 3}
d = {key:value for key,value in d.items() if value <= 1}
print(d)
字典推导式的形式,形如{key:value for 循环 if 条件} 的形式
027 格式化输出
创建一个字典key是a,b,c,value分别是列表1~10,列表11~20,列表21~30
最终产生如下输出
{'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'b': [11, 12, 13, 14, 15, 16, 17, 18, 19],
'c': [21, 22, 23, 24, 25, 26, 27, 28, 29]}
代码:
from pprint import pprint
d = {"a":list(range(1,11)),
"b":list(range(11,20)),
"c":list(range(21,30))}
pprint(d)
lsit(range)组合可以把一串数字变成list,pprint打印数据,会比较整齐的输出
那怎么访问key=b的列表第三个元素
看代码:
d = {"a":list(range(1,11)),
"b":list(range(11,20)),
"c":list(range(21,30))}
print(d["b"][2])
先访问的d["b"]是一个列表,对这个列表使用下标[2]得到第三个元素
如何遍历上面字典
代码:
d = {"a":list(range(1,11)),
"b":list(range(11,20)),
"c":list(range(21,30))}
for key,value in d.items():
print(key,"has value",value)