一、遍历字典
1.1 dict.keys()
- 作用: 获取字典中所有的键
- 语法格式: dict.keys()
实例分析:
dict1 = {
"name": "肖辰",
"age": 21,
"gender": "男",
"hobbry": "move"
}
print(dict1.keys())
----------------输出---------------------------
dict_keys(['name', 'age', 'gender', 'hobbry'])
上面返回的是一个序列。
1.2 dict.values()
- 作用: 获取字典中所有的值。
- 语法格式: dict.values()
实例分析:
print(dict1.values())
dict_values(['肖辰', 21, '男', 'move'])
1.3 dict.items()
- 作用:获取字典中的所有的键值对, 也可以称为项(item)
- 语法: dict.items()
print(dict1.items())
dict_items([('name', '肖辰'), ('age', 21), ('gender', '男'), ('hobbry', 'move')])
我们还可以通过for 循环来对键值对中的key ,value 进一步取值。
for i in dict4.items():
二、集合
2.1 集合简介
- 集合只能存储不可变对象,比如字符串,整型,布尔值,元组等,如果是list 则就不能存储与集合中。但是集合本身是可变类型的。
- 集合中存储的对象是无序的,也就是集合中是没有索引的。
- 集合不能出现重复的元素。
- 语法: set 表示集合,使用大括号 '{}' : set{}
2.2 集合特性
(1) 集合是无序的, set{} 表示一个空集合。
set1 = {7, 1, 4}
print(set1)
{1, 4, 7}
(2) 集合中不能出现重复的数据。
根据这个特性,我们可以做到去重的操作。
set2 = {11, 33, 11, 44, 77, 99, 77}
print(set2)
{33, 99, 11, 44, 77}
(3) 集合中只能存储不可变类型,不能存储list 这些可变类型。
set 3 = {[2, 3, 4]}
TypeError: unhashable type: 'set'
(4) 注意空集合与空字典的区别
- set4 = {} # 这是一个空字典
- set5 = set() # 这样才是创建一个空集合,集合是可变类型,所以是有意义的。
- tuple = () # 空元组,没有实际意义,因为元组是不可变的。
(5) 强制转换为集合的业务场景: 去重
list2 = [11, 33, 11, 44, 77, 99, 77]
set5 = set(list2)
print(set5)
list2= list(set5)
{33, 99, 11, 44, 77}
[33, 99, 11, 44, 77]
2.3 集合的应用
(1) set.add() 添加元素
- 作用: 向集合中添加元素,如果添加的元素已存在,则不进行任何操作。
set1 = set()
set1.add(111)
print(set1)
{111}
(2) set.update()
- 作用:将一个元素或集合添加到当前集合中。如果添加的元素在集合中已经存在,则该元素只会出现一次,重复的忽略。
x = {"google", "baidu", "bing"}
y = {"firefox", "bing"}
x.update(y) # 将y 添加到x 集合中
print(x)
{'firefox', 'bing', 'baidu', 'google'}
(3) set.remove(x) 删除元素
- 将元素x 从当前集合中移除,如果元素不存在,则发生错误。
x = {"google", "baidu", "bing"}
x.remove("bing")
print(x)
x.remove("sougou")
print(x)
-----------------输出------------------
{'baidu', 'google'}
KeyError: 'sougou'
还有一个方法,删除集合中不存在的元素时,不会报错: set.discard() 删除集合中指定的元素
y = {"google", "baidu", "bing"}
y.discard("firfox")
print(y)
{'google', 'bing', 'baidu'}
(4) len(set)
- 计算集合中元素个数
browser = {"google", "baidu", "bing", "firfox", "sougou"}
print(len(browser))
5
(5) set.clear() 清空集合
browser = {"google", "baidu", "bing", "firfox", "sougou"}
browser.clear()
print(len(browser))
0
(6) set.pop() 随机移除一个元素
s = {"google", "baidu", "bing", "firfox", "sougou"}
s.pop()
print(s)
{'google', 'firfox', 'sougou', 'baidu'}
{'firfox', 'sougou', 'bing', 'google'}
{'baidu', 'sougou', 'firfox', 'google'}
(7) set.copy() 拷贝一个集合
fruits = {"apple", '"orange", "mango"}
a = fruits.copy()
print(a)
{'orange', 'apple', 'mango'}
2.3 集合的运算
- 交集运算 :&
相同部分 (set1 & set2) - 并集运算: |
集合合并 (set1 | set2) - 差集运算: -
集合不同部分 (set1 - set2) - 异或运算:^
减掉重复的部分 (set1 ^ set2) - 检查一个集合是否是另外一个集合的子集 : <=
- 检查一个集合是否是另外一个集合的真子集:<
- 检查一个集合是否是另外一个集合的超集: >=
- 检查一个集合是否是另外一个集合的真超集: >
三、可变类型与不可变类型
- 可变类型:包含列表list[]、字典dict{} 、集合set()
- 所谓可变,即该对象所指的内存中的值可以被改变,变量改变后,实际上其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗的说: 值改变了,但是id 不变。
- 不可变类型:一旦创建就不能修改的对象,包括 字符串str、元组 tuple()、整型等。
- 所谓不可变,就是该对象所指向的内存中的值不能改变,当改变某个变量的时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这样会开辟一个新的地址,变量再指向这个新的地址。通俗来说:值改变了,id 就改变了。
四、函数
4.1 函数简介
- 函数也是一个对象
- 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用。
- 语法格式:
def 函数名([形参1, 形参2,形参3,形参……]):
代码块
注意:
- 函数名必须符合表示符的规范(字母、数字、下划线,不能以数字开头)
- print是函数对象,print() 是调用函数。
def fun():
print("这是我的第一个函数")
# 调用函数
fun()
这是我的第一个函数
4.2 函数的参数
(1) 形参与实参
def fun(a, b): # a,b 叫形参,形式上的参数
#a = 1
#b = 2
print(a + b)
# 调用
fun(1, 2) # 实参
(2) 形参与实参的个数要对应。
def fun(x, y ,z):
print(x)
print(y)
print(z)
## 调用
fun(1, 3, 4)
(3) 当给形参指定默认值时,比如z=0, 当没有传递实参的时候,使用该默认值,如果传递了参数就使用传递值。
def fun(x, y, z=0):
print(x)
print(y)
print(z)
## 调用
fun(1,5)
1
5
0
4.3 函数传参的方式
1. 位置传参
即: 对应位置的实参传递给对应位置的实参
def fun(a, b, c):
print(a)
print(b)
print(c)
fun(1,2,4)
1
2
4
2. 关键字传参
即:关键字参数可以不按照形参定义的顺序取传递,而是根据参数名进行传递。
def fun(a, b, c):
print(a)
print(b)
print(c)
fun(a=1, c=3, b=2)
1
2
3
3. 位置传参与关键字传参混合使用
- 混合使用时,位置传参必须位于关键字传参的前面。
def fun(a,b,c):
print(a)
print(b)
print(c)
fun(1,2,c=3)
实参的类型
(1) 实参不管是什么类型都可以。
def fun(a):
print(a)
a=1
a = [1,3,5]
a = "hello world"
a = {"DB_PORT": 3306}
a = True
fun(b)
1
[1, 3, 5]
"hello world"
{"DB_PORT": 3306}
True
(2) 注意形参重新赋值的情况
def fun2(a): # 注意,这里a=b=1 ,这里的a 是形参,而 后面的 a = 10 是要给实参。
a = 10
print(a)
b = 1
fun2(b)
print(b)
a =10
b = 1
(3) 案例2
def fun3(a): #a = b
a[0] = 10
print(a)
b = 1
b = [1, 3, 5]
fun3(b)
-------------------------
[10, 3 ,5]
[10, 3 ,5]
上面分析:
首先, b = [1, 3, 5] 覆盖掉了 b = 1,所以,b =[1, 3, 5], a = b =[1,3,5]
然后,执行函数:a = b = [1, 3, 5]
第二行 a[0] = 10, 只是更改了 list a中的元素,并不是重新赋值,所以 最终都是 [10, 3 ,5]
- 假如,上面例子中不想更改 b的值呢 ?
def fun4(a):
a[0] = 10
print(a)
b = 1
b = [1, 3, 5]
c = b.copy()
fun4(c)
-----------------------
[10, 3 ,5]
[1, 3, 5]
练习
- 打印名片程序: 输入姓名,电话号码,性别,最后打印出来名片
- 控制姓名长度 6-20个字符
- 电话号码长度11
- 性别只能允许输入男或女
- 每一样信息不允许为空
def username():
while True:
name = input("请输入用户名(长度为6-20个字符):")
if len(name)< 6 or len(name) > 20:
print("姓名不符合要求,请输入6-20位~")
continue
else:
print("姓名输入成功!")
break
return name
def tel():
while True:
phone = input("请输入电话号码:")
if not phone.isdigit():
print("电话号码不符合要求,请重新输入")
continue
else:
if len(phone) != 11:
print("电话号码不符合要求")
else:
print("电话号码输入成功!")
print(phone)
break
return phone
def gender():
while True:
sex = input("请输入性别(男/女):")
if sex != "男" and sex != "女":
print("性别不符合要求,请重新输入~")
continue
else:
print("性别输入成功!")
break
return sex
card = {
"name": username(),
"phone": tel(),
"sex": gender()
}
info = []
for i in card.values():
info.append(i)
print(card)
print("信息输入完成~")
-----------------
请输入用户名(长度为6-20个字符):suning
姓名输入成功!
请输入电话号码:18999003435
电话号码输入成功!
18999003435
请输入性别(男/女):nv
性别不符合要求,请重新输入~
请输入性别(男/女):女
性别输入成功!
['suning', '18999003435', '女']
信息输入完成~
- 使用函数求前 20 个斐波那契数列: 1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和
方式一: 利用while 循环
i = 0
list = [1,1]
while i < 18:
list.append(list[i] + list[i+1])
i += 1
#print(list)
for i in list:
print(i,end=" ")
------------输出-----------
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
方式二: 利用函数
def feibo(n):
i = 0
res = [1,1]
while i < n-2:
res.append(res[i]+res[i+1])
i += 1
for i in res:
print(i,end=" ")
feibo(20)
---------------输出-----------------
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
- 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def sum(n):
i = 0
sum = 0
while i < n:
i += 1 ## 定义整数
sum = sum + i ## 求和
print(sum)
sum(100)
------------------输出------------------
5050