PythonDay03---条件、循环语句、Dict(增删改查)和Set

Python条件、循环语句、Dict(增删改查)和Set

一、Python的条件判断和循环

1.Python之if语句

语法: if + 空格 + 表达式,然后用:表示代码块开始。
eg:

age = 20
if age >= 18:
    print('your age is', age)
    print('adult')
print('END')

结果:

your age is 20
adult
END

注意: Python代码的缩进规则。具有相同缩进的代码被视为代码块,上面的3,4行 print 语句就构成一个代码块(但不包括第5行的print)。如果 if 语句判断为 True,就会执行这个代码块。缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误。

2.Python之if-else语句

eg:

if age >= 18:
    print('adult')
else:
    print('teenager')

注意: else 后面有个:

3.Python之if-elif-else语句

eg:

age = 20
if age >= 6:
    print('teenager')
elif age >= 18:
    print('adult')
else:
    print('kid')

结果:

teenage

特别注意: 这一系列条件判断会从上到下依次判断,如果某个判断为 True,执行完对应的代码块,后面的条件判断就直接忽略,不再执行了

4.Python之 for循环

说明:Python的 for 循环可以依次把list或tuple的每个元素迭代出来。
eg:

L = ['Adam', 'Lisa', 'Bart']
for name in L:
    print(name)

结果:

Adam
Lisa
Bart

总结:这个for循环和Java里面的for-each循环有点类似

5.Python之while循环

eg:利用while循环计算100以内奇数的和

sum = 0
x = 1
while x < 100:
    sum = sum + x
    x = x + 2
print(sum)

结果:2500

6.Python之break和continue

用法和c语言的一样

7.Python之循环嵌套

eg:对100以内的两位数,请使用一个两重循环打印出所有十位数数字比个位数数字小的数,例如,23(2 < 3)。

for x in range(1, 10):
    for y in range(0, 10):
        if x < y:
            print(x * 10 + y)

结果:

12
13
14
15
16
17
18
19
23
24
25
26
27
28
29
34
35
36
37
38
39
45
46
47
48
49
56
57
58
59
67
68
69
78
79
89

最后,需要说明的是由于 Python 不支持 switch 语句,因此,当存在存在多个条件判断时,我们需要用 else if 来实现。

二、Dict

1.Dict简介和建立

(1)list 和 tuple 可以用来表示顺序集合,而dict是无序集合。所以显示dict时,key-value的顺序可能不一样。另外,dict的元素是以key-value,即键值对的形式存在。
(2)dict的查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
(3)dict是按 key 查找,所以,在一个dict中,key不能重复
(4)dict的 key 的元素必须不可变,也就是说key不能为list,而value无所谓。
(5)建立dict语法:花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。
eg:创建一个dict

d = {
    'wang' : 100,
    'zhao' : 90,
    'li' : 80
}
print(d)

结果:{'wang': 100, 'zhao': 90, 'li': 80}

建议:对于list、tuple、dict集合中字符串元素最好是用单引号不用双引号,因为,显示list、tuple和dict中的字符串时,是以单引号的形式显示的,所以,我们用单引号统一比较好。print函数无所谓。
(4)由于dict也是集合,len() 函数可以计算任意集合的大小:
eg:

d = {
    'wang' : 100,
    'zhao' : 90,
    'li' : 80
}
len(d)

结果:3
注意: 一个 key-value 算一个,因此,dict大小为3。

2.Dict添加元素

dict添加元素有两种方法:
(1)语法:d[key] = value
说明:如果dict中有该key,则用value替换原来的value,若dict不存在该key,则dict添加key:value这对元素。
eg:

d = {
    'wang' : 100,
    'zhao' : 90,
    'li' : 80
}
d['wang'] = 50
print(d)
d['tian'] = 20
print(d)

结果:

{'wang': 50, 'zhao': 90, 'li': 80}
{'wang': 50, 'zhao': 90, 'li': 80, 'tian': 20}

(2)用setdefault(key, value = None)方法。
eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
print(d)
d.setdefault('wang', 30)
print(d)
d.setdefault('xu')
print(d)
d.setdefault('tian', 50)
print(d)

结果:

{'wang': 100, 'zhao': 80, 'li': 60}
{'wang': 100, 'zhao': 80, 'li': 60}
{'wang': 100, 'zhao': 80, 'li': 60, 'xu': None}
{'wang': 100, 'zhao': 80, 'li': 60, 'xu': None, 'tian': 50}

注意:若key存在,用setdefault(key, value = None)方法是不能更改dict的元素的,另外,value默认为None

3.dict删除元素

删除dict中的元素有5中方法:
(1)用pop(key)方法
说明:这与列表的pop()方法不同,dict的pop()方法必须得给它传一个key值,如果字典里没有该key,则会报错。也可以用 pop(key,‘返回值’) 来指定返回值,此时,当找不到key的时候,则不会报错,会将指定的返回值返回。
eg:key不存在,并且没有设置返回值

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
d.pop('tian')

结果:

Traceback (most recent call last):
  File "Hello.py", line 6, in <module>
    d.pop('tian')
KeyError: 'tian'

eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
a = d.pop('tian', '没有该key')
print(a)
print(d)
d.pop('wang')
print(d)

结果:

没有该key
{'wang': 100, 'zhao': 80, 'li': 60}
{'zhao': 80, 'li': 60}

(2)popitem()方法:
说明:此方法类似于列表的pop()方法,用来随机删除一个元素,返回删除的那个元素的(健,值)
eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
x,y = d.popitem()
print(x, ':', y)
print(d)

结果:

li : 60
{'wang': 100, 'zhao': 80}

(3)del dict[key]语句
说明:此方法用来删除字典种指定key以及它所对应的value,如果找不到该key,则会报错。
eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
del d['wang']
print(d)

结果:{'zhao': 80, 'li': 60}
(4)clear()方法:
说明:该方法与列表的clear()方法类似,用来清空字典。
eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
d.clear()
print(d)

结果:{}
(5)del dict语句
说明:删除该dict
eg:

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
del d
print(d)

结果:

Traceback (most recent call last):
  File "Hello.py", line 7, in <module>
    print(d)
NameError: name 'd' is not defined
4.更改dict元素

语法:dict[key] = value
上面第4点,删除dict元素的(1)中提到了,这里不再说明。

5.访问Dict

语法:使用 d[key]的形式来查找对应的 value
eg:

d = {
    'wang' : 100,
    'zhao' : 90,
    'li' : 80
}
print(d['wang'])

结果:100
若访问不存在的value会报KeyError的错误,那怎么避免?有两种方法
(1)先判断一下 key 是否存在,用 in 操作符:

if key in d:
    print(d[key])

(2) 使用dict本身提供的一个get (key, value=None)方法,在Key不存在的时候,返回None, 如果设置第二个参数的值,如果key不存在,则会返回你指定的值:
eg:print(d.get('wang'))结果:100
eg:print(d.get('xu'))结果:None
eg:接收一个列表,找出其中数量最多的元素,如果元素数量相同,选择列表中靠前的元素输出。

counts={}
num=eval(input())
for i in num:
    counts[i]=counts.get(i,0)+1  # 如果元素已经存在,会加一,不存在,设置为一,很巧妙
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
num, a=items[0]
print(int(num))
6.得到key和value遍历Dict

语法:keys()方法和values()方法

d = {
    'wang': 100,
	'zhao': 80,
	'li': 60
}
print(d.keys())
print(list(d.keys()))
print(d.values())
print(list(d.values()))
for key in d.keys():
    print(key)
for value in d.values():
    print(value)

结果:

dict_keys(['wang', 'zhao', 'li'])
['wang', 'zhao', 'li']
dict_values([100, 80, 60])
[100, 80, 60]
wang
zhao
li
100
80
60

注意:用for循环来遍历dict,只会显示其key的值。

eg:

d = {
    'wang' : 100,
    'zhao' : 90,
    'li' : 80
}
for key in d:
    print(key)

结果:

wang
zhao
li

三、Set

1.建立Set

说明:set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。这样看来,set是为dict的key值量身定做的。创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素。
eg:

d = ['wang', 'zhao', 'li', 'li']
s = set(d)
print(s)

结果:

{'zhao', 'li', 'wang'}

注意:可以看到set会自动去掉重复的元素。

2.访问Set元素

说明:由于set存储的是无序集合,所以我们没法通过索引来访问。访问 set中的某个元素实际上就是判断一个元素是否在set中。
eg:

d = ['wang', 'zhao', 'li', 'li']
s = set(d)
print('wang' in s)

结果:True

3.Set的特点

(1)set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快。
(2)set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。
注意:有的人可能会问,list不是可变的吗?list确实是可变的,但是执行s = set(d)时,d的元素是固定的,d把元素复制给s,你再改变d的元素是不会影响s中的元素的。而dict不一样,假如dict的key可以是list的话,假设dict的key是list,你可以更改list中的元素。如果您还不能理解,见如下代码:

d = ['wang', 'zhao', 'li']
s = set(d)
d[1] = 'xu'
print(s)
s = set(d)
print(s)

结果:

{'li', 'zhao', 'wang'}
{'xu', 'li', 'wang'}

(3)set的这些特点,可以应用在哪些地方呢?
假设我们让用户输入星期一至星期日的某天,如何判断用户的输入是否是一个有效的星期呢?
eg:

x = 'MON'      #假设x是用户输入的日期
s = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
if x in s:
    print(x)
else:
    print("您输入的日期错误!")

结果:MON

还可以用来去重,比如你用爬虫爬取了一些链接,里面可能有重复的链接,这样,你完全可以将一个list转为set来去掉这些重复的链接。

4.遍历Set

用for循环来遍历set
eg:

d = ['wang', 'zhao', 'li']
s = set(d)
for name in s:
    print(name)

结果:

wang
li
zhao
5.Set之添加元素

(1)添加元素,用add()方法
eg:

d = ['wang', 'zhao', 'li']
s = set(d)
print(s)
s.add('xu')
print(s)

结果:

{'li', 'zhao', 'wang'}
{'xu', 'li', 'zhao', 'wang'}

(2)用update()方法
eg:

s1 = set([1, 2, 3])
s2 = set(['a', 'b'])
s1.update(s2)
print(s1)

结果:{'a', 1, 2, 3, 'b'}

6.Set之删除元素

(1)删除元素,用remove()方法.
eg:

d = ['wang', 'zhao', 'li']
s = set(d)
print(s)
s.remove('li')
print(s)

结果:

{'li', 'wang', 'zhao'}
{'wang', 'zhao'}

(2)pop( )方法随机删除(蛮简单,不写代码了)
(3)clear( )方法 清空集合元素(蛮简单,不写代码了)

四、字典和集合的工作原理

字典和集合的内部结构都是一张哈希表。

  • 对于字典而言,这张表存储了哈希值(hash)、键和值这 3 个元素
  • 而对集合来说,区别就是哈希表内没有键和值的配对,只有单一的元素

老版本 Python 的哈希表结构如下所示:

--+-------------------------------+
  | 哈希值 (hash)  键 (key)  值 (value)
--+-------------------------------+
0 |    hash0      key0    value0
--+-------------------------------+
1 |    hash1      key1    value1
--+-------------------------------+
2 |    hash2      key2    value2
--+-------------------------------+
. |           ...
__+_______________________________+

这样的设计结构显然非常浪费存储空间。为了提高存储空间的利用率,现在的哈希表除了字典本身的结构,会把索引和哈希值、键、值单独分开,也就是下面这样新的结构:

Indices
----------------------------------------------------
None | index | None | None | index | None | index ...
----------------------------------------------------

Entries
--------------------
hash0   key0  value0
---------------------
hash1   key1  value1
---------------------
hash2   key2  value2
---------------------
        ...
---------------------

我们可以很清晰地看到,空间利用率得到很大的提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值