9、Python基础之遍历字典及函数基本概念

一、遍历字典

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 集合的运算
  1. 交集运算 :&
    相同部分 (set1 & set2)
  2. 并集运算: |
    集合合并 (set1 | set2)
  3. 差集运算: -
    集合不同部分 (set1 - set2)
  4. 异或运算:^
    减掉重复的部分 (set1 ^ set2)
  5. 检查一个集合是否是另外一个集合的子集 : <=
  6. 检查一个集合是否是另外一个集合的真子集:<
  7. 检查一个集合是否是另外一个集合的超集: >=
  8. 检查一个集合是否是另外一个集合的真超集: >

三、可变类型与不可变类型

  • 可变类型:包含列表list[]、字典dict{} 、集合set()
    • 所谓可变,即该对象所指的内存中的值可以被改变,变量改变后,实际上其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗的说: 值改变了,但是id 不变。
  • 不可变类型:一旦创建就不能修改的对象,包括 字符串str、元组 tuple()、整型等。
    • 所谓不可变,就是该对象所指向的内存中的值不能改变,当改变某个变量的时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这样会开辟一个新的地址,变量再指向这个新的地址。通俗来说:值改变了,id 就改变了。

四、函数

4.1 函数简介
  • 函数也是一个对象
  • 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用。
  • 语法格式:
def  函数名([形参1, 形参2,形参3,形参……]):
       代码块

注意:

  1. 函数名必须符合表示符的规范(字母、数字、下划线,不能以数字开头)
  2. 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]

练习

  1. 打印名片程序: 输入姓名,电话号码,性别,最后打印出来名片
    • 控制姓名长度 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', '女']
信息输入完成~
  1. 使用函数求前 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. 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def sum(n):
    i = 0
    sum = 0
    while i < n:
        i += 1    ## 定义整数
        sum = sum + i    ## 求和
    print(sum)
sum(100)
------------------输出------------------
5050

你可能感兴趣的:(9、Python基础之遍历字典及函数基本概念)