进入目标:
|-- 递归
|-- 全局函数
|-- 容器的学习
|-- list
|-- set
|-- tuple
|-- dict
递归(recursion):
什么是递归:
函数自身调用自身
注意:递归必须要存在终止条件,否则就是一个死循环,而且递归是自身调用自身
在java等编程语言,如果递归没有终止条件,或者递归的层数太深,则可能出现Stack Overflow Error
错误,该错误表示栈溢出错误(栈的内存空间不够了)
但是python、JavaScript等编程中,一般都会规定递归的层数,默认都是1000层
也可以修改默认的层数:
import sys
sys.getrecursionlimit() # 获取默认的递归层数
sys.setrecursionlimit(num) # 重新设置递归的最深层数
递归的实际使用
斐波那契数列:从第三个数开始,每一个是前两项数之和
课堂练习:
1、上楼梯问题:
有人上楼梯,每一次可以上一个台阶或者两个台阶,问:当到达第n个台阶时,共有多少种走法?
2、不死兔子,小明高考结束,考上了清华,父母很开心,所以买了一对刚刚出生的兔子
一对刚刚出生的兔子,经过四个月的成长就可以成长成年兔子,成年兔子每个月生一对兔子
假设兔子一直不死,问,当第n月时,共有多少对兔子?
3、汉诺塔
容器篇:
变量这种存储单个数据的容器,也会提供存储多个数据容器
线性容器:
数组(Array):连续内存
链表(List):python list的容器,底层使用的就是双向链表结构
栈(Stack):先进后出
队列(queue):先进先出
hash表:
list:
列表,是一种线性结构的容器,底层使用的双向链表结构设计
定义一个list容器:
利用弱数据类型语言的特点:直接将[]这种列表数据赋给变量,则变量就是list类型
ls = [1, 2, 3, 3, 445]
也可以使用全局函数list
ls = list()
ls = list([1, 2, 3, 3, 445])
访问列表中的元素:
因为list是有序的线性结构,因此每一个都是存在下标(索引)的,所以可以直接通过下标来访问
列表对象[下标] # 获取变量对应的元素
注意:下标从0开始
得到list中的元素个数:
len(列表对象) # 返回对象的元素个数
列表的遍历:
for 临时变量 in 容器:
每一次循环得到一个元素,被保存到临时变量中
也可以使用while,通过索引获取
list列表的常见方法:
dir(模块/对象) # dir全局函数可以打印输出模块或者对象的方法或者属性
help(方法) # 返回帮助文档
['append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
|-- append(新元素) # 在尾部添加新元素
|-- insert(index, 新元素) # 在index位置添加新元素
|-- extend(列表) # 合并列表
|-- clear() # 清空列表
|-- pop() # 删除最后一个元素,并返回它
|-- remove(元素) # 删除对应的元素
|-- index(元素) # 返回元素的下标索引
|-- count(元素) # 统计某个元素在列表中的数量
|-- reverse() # 翻转列表
|-- sort() # 数据的类型必须相同
|-- copy() # 复制list对象
set(集合):
set是一种无序的集合,是一种hash表(哈希表)的实现,所以具备如下特点:
1、无序
2、不重复
定义一个set:
s = {必须有元素} # 注意,不要使用空的{},这样定义的是dict
常见方法:
['add', 'clear', 'copy', 'difference', 'difference_update',
'discard', 'intersection', 'intersection_update', 'isdisjoint',
'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference',
'symmetric_difference_update', 'union', 'update']
|-- add(新元素) # 添加新的元素
|-- clear() # 清空集合
|-- copy() # 浅拷贝set
|-- difference() # 求两个集合的差集
|-- union # 求两个集合的并集
|-- intersection # 求两个集合的交集
|-- remove() # 移除元素,如果该元素不存在,则抛出错误
|-- pop() # 随机移除一个元素
|-- discard() # 移除元素,如果该元素不存在,则什么都不做
tuple(元组):
不可变数据类型,类似于其他编程语言中的枚举类型
代表一组固定不变的
|-- index(元素) # 返回元素的下标索引
|-- count(元素) # 统计某个元素在列表中的数量
dict(字典):
['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']