Python 之 递归 字典 集合

马山要期末考试了,又要开始卑微的学习了

递归的使用

  • 递归函数的书写,踩坑: 函数语句中都会有if else 语句中,每句都有return,如果if语句中没有return,起步递归将返回None;如果else语句中没有return语句,递归将会返回None
"""
递归
"""


def function1(number):  # 非递归函数,求阶乘
    result = 1
    for i in range(1, number + 1):
        result = i * result
    return result


def function2(number):  # 递归函数,求阶乘
    if number == 1:
        return 1
    else:
        return number * function2(number - 1)  # return必须有,否则返回None,你知道为什么吗??


n = int(input("请输入一个数:"))
print("%d的阶乘是%d" % (n, function1(n)))  # 6的阶乘是720
print('%d的阶乘是%d' % (n, function2(n)))  # 6的阶乘是720

斐波那契数列的递归与迭代书写

斐波那契数列的递归书写:

  • 可以看出,递归书写更加符合斐波那契数列函数以及人类的思维
  • 递归可以使代码简洁,可读性增加,但同时也会增加时间 空间的复杂度
def f1(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return f1(n - 1) + f1(n - 2)
print(f1(12))  # 144

斐波那契数列的迭代书写:

  • 利用迭代的思想可以完成斐波那契数列的书写,但理解起来需要下一番功夫
  • 合理运用递归操作在以后的代码生涯是非常必要的
def f2(n):
    n1 = 1
    n2 = 1
    n3 = 1
    while (n - 2) > 0:
        n3 = n2 + n1  # n3在这里没啥实际意义,就是为了完成下面n1 n2 的赋值操作
        n1 = n2
        n2 = n3
        n -= 1
    print(n)
    if n == 1:
        return n1
    else:
        return n2
print(f2(12))  # 144        

运用递归完成汉诺塔问题

汉诺塔是一种益智玩具,源自古老的印度。如图1、图2及图3所示,有三根柱子,若干个大小不等的圆盘按顺序依次叠落在起点(左侧)的柱子上,通过多次移动后,全部圆盘要叠落在终点(右侧)的柱子上。移动必需遵守两个原则:

  1. 每次只能移动一个圆盘
  2. 移动过程中,大圆盘不允许覆盖在小圆盘上。
    汉诺塔1
    汉诺塔2
    汉诺塔3
def h(n, x, y, z):
    if n == 1:
        print(x, '--->', z)
    else:
        h(n - 1, x, z, y)  # 这一步可以理解为先把n-1层移动到y柱
        print(x, '--->', z)  # 在上一步的基础上,把最大的那个从x柱移动到z柱
        h(n - 1, y, x, z)  # 以上两步的基础上,发现跟n层的变化就是起始位置x柱变成了y柱,故,将y柱与x柱变换

唯一的映射类型 —— 字典

  • 字典是键 值的组合,属于Python中唯一的映射类型
  • 可以利用可迭代序列(iterable)和遍历赋值 来创建字典
  • 可以利用可迭代序列(iterable)构成的映射关系来创建字典
  • 利用工厂函数dict() 关键字参数来创建字典
  • 根据键对字典进行修改时,如果字典中没有指定的 键 ,则会直接增加一对键值对
d = {}  # 创建空字典
d1 = dict()
print(d)
print(d1)
dict1 = {'name': "cc雪影", 'sex': '男', 'age': '21'}  # 创建非空字典
print(dict1['name'], dict1['age'])
iterable = ((1, 'one'), (2, 'two'))  # 利用可迭代序列构成的
for k, v in iterable:
    d[k] = v
print(d)
dict2 = dict(((1, 'one'), (2, 'two'), (3, 'three')))  # 利用元组或列表构成映射关系(maping)来创建字典
print(dict2)  # dict2: {1: 'one', 2: 'two', 3: 'three'}
dict3 = dict(name='cc雪影', sex='男', age='21')  # 用关键字参数来创建字典
print(dict3)  # dict3: {'name': 'cc雪影', 'sex': '男', 'age': '21'}
print(dict3['name'])  # cc雪影
dict3['name'] = '老王'  # 字典值的修改 dict3: {'name': '老王', 'sex': '男', 'age': '21'}
dict3['heigh']='187cm'  # 字典键值对的修改 {'name': '老王', 'sex': '男', 'age': '21', 'heigh': '187cm'}

字典的常用方法

  • fromkeys(iterable,value),创建字典,而且不会在原有字典的基础上修改,而是直接创建一个新的字典
  • keys()列表的形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典所有的键
  • values()列表的形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典所有的值
  • items()列表的形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典所有可遍历的(键, 值) 元组数组
  • get() 可以根据键来获取 值,也可以根据键对来获取 值,如果字典中不存在该键值对,则自动增加并返回 值
  • innot in 用来判断 键 是否在字典里,返回值为Bool类型
  • copy() 浅copy,不同与赋值,浅copy是将字典复制产生新的字典
  • popitem() 随机弹出(键,值),可以进行赋值,会改变原字典
  • pop() 根据 键 弹出 值,可以进行赋值,会改变原字典
  • setdefault() 给字典增加键值对
  • update() 将字典并入字典中,dict.update(dict)
  • clear() 清空字典
dict0 = {}
dict1 = dict0.fromkeys((1, 2, 3))  # dict1: {1: None, 2: None, 3: None}
dict2 = dict0.fromkeys((1, 2, 3), "hello")  # dict2:{1: 'hello', 2: 'hello', 3: 'hello'}
dict3 = dict0.fromkeys((1, 2, 3), ('one', 'two', 'three'))
# dict3: {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
dict2 = dict2.fromkeys((1, 3), 'hi')  # 重新创建一个新的字典 {1: 'hi', 3: 'hi'}而不是在原有字典的基础上修改,
dict4=dict0.fromkeys(range(6),'牛')  # {0: '牛', 1: '牛', 2: '牛', 3: '牛', 4: '牛', 5: '牛'}
for eachKey in dict4.keys():  # 打印 键
    print(eachKey,end=' ')  # print:  0 1 2 3 4 5
for eachValue in dict4.values():  # 打印 值
    print(eachValue,end=' ')  # print:  牛 牛 牛 牛 牛 牛
for eachItem in dict4.items():  # 打印 象
    print(eachItem,end=' ') # print:  (0, '牛') (1, '牛') (2, '牛') (3, '牛') (4, '牛') (5, '牛')
print(dict4.get(5))  # 牛
print(dict4.get(4,'牛'))  # 牛
print(dict4.get(6,"B"))  # B
print(dict4)  # dict4: {0: '牛', 1: '牛', 2: '牛', 3: '牛', 4: '牛', 5: '牛'}
print(4 in dict4)   # 查找的是键而不是值,打印的是 True
a=dict4.copy()  # 浅copy,把子字典复制后让 a 管理
b=dict4  # 赋值操作,dict4 和 b 共同管理字典{0: '牛', 1: '牛', 2: '牛', 3: '牛', 4: '牛', 5: '牛'}
print('id(a):',id(a)," ",'id(b):',id(b)," ",'id(dict4):',id(dict4))
str1=dict4.popitem() # 随机弹出一个像,可以进行赋值 str1='(5, '牛')'
str2=dict4.pop(1)  # pop()根据 键 弹出 值,可以进行赋值 str2='牛'
print(dict4)  # dict4: {0: '牛', 2: '牛', 3: '牛', 4: '牛'},可以看出popitem(),pop()均会改变原字典
dict4.setdefault(7) # {0: '牛', 2: '牛', 3: '牛', 4: '牛', 7: None}
dict4.setdefault(8,'赞赞赞')  # {0: '牛', 2: '牛', 3: '牛', 4: '牛', 7: None, 8: '赞赞赞'}
dict5={7:'update'}
dict4.update(dict5)  # dic4: {0: '牛', 2: '牛', 3: '牛', 4: '牛', 7: 'update', 8: '赞赞赞'}
dict4.clear()  # 清空字典 dict4: {}

我们熟悉的 集合

  • 集合的唯一性:集合的元素不重复
  • 集合的无序性:不可以通过索引来获取元素
  • in , not in 可以用来判断元素是否在集合中
  • add() 增加集合的元素
  • remove() 去除集合中指定的元素
  • frozen() 不可变集合,没有add() remove()
num1 = {1, 2, 3}  # 创建一个集合
num2 = set([1, 2, 3])  # 利用set工厂函数创建集合,参数是一个可迭代序列(iterable)
num3 = {1, 3, 4, 2, 1}  # 集合的唯一性,num2: {1, 2, 3, 4} 注:集合是无序的
print(num2)
# 关于去除列表中重复元素的两种常见方法
# 1、使用遍历去除列表重复的元素
list1 = [1, 3, 4, 3, 4, 2, 1, 3, 0, 1]
list2 = []
for each in list1:
    if each not in list2:
        list2.append(each)
print(list2)  # [1, 3, 4, 2, 0]
# 2、利用集合元素唯一性去除列表重复的元素
list3 = list1.copy()
set1 = set(list3)
list4 = list(set1)
print(list4)  # [0, 1, 2, 3, 4]
# 判断元素是否在集合中 in 、not in
print(1 in set1)
print('1'in set1)
set1.add(5)  # 增加集合的元素 set1: {0, 1, 2, 3, 4, 5}
set1.remove(5)  # 去除集合中的指定元素 set1: {0, 1, 2, 3, 4}
set2=frozenset([1,2,3])  # 不可变集合,没有add() remove()
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值