5Python集合容器
数据结构数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。
线性数据结构有: 线性表、栈、队列、串、数组和文件; 非线性数据结构有: 散列表、树和图。
线性表:线性表的逻辑结构是n个数据元素的有限序列:(a1, a2 ,a3,…an)n为线性表的长度(n≥0),n=0的表称为空表。数据元素呈线性关系。必存在唯一的称为“第一个”的数据元素;必存在唯一的称为“最后一个”的数据元素;除第一个元素外,每个元素都有且只有一个前驱元素; 除最后一个元素外,每个元素都有且只有一个后继元素。所有数据元素在同一个线性表中必须是相同的数据类型。2/48线性表按其存储结构可分为顺序表和链表。用顺序存储结构存储的线性表称为顺序表;用链式存储结构存储的线性表称为链表。将线性表中的数据元素依次存放在某个存储区域中,所形成的表称为顺序表。一维数组就是用顺序方式存储的线性表。链表(数据经常插入删除用链表)栈(Stack)也是一种特殊的线性表,是一种后进先出(LIFO)的结构。栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的物理存储可以用顺序存储结构,也可以用链式存储结构。3/48队列(Queue) 是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。表中允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。队列的操作是按先进先出(FIFO)的原则进行的。队列的物理存储可以用顺序存储结构,也可以用链式存储结构。散列表又称为哈希表。散列表算法的基本思想是:4/48以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址。当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除。在C#语言中,通过负载因子(loadfactor)来决定何时对散列表进行再散列。例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那 么将进行再散列。负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间越长。负载因子越低(越接近0.0),元素的寻找时 间越短,内存浪费越多。列表List1. Python内置的一种数据类型是列表:list。2. list是一种有序的集合,可以随时添加和删除其中的元5/48素。3. 序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。4. 列表可以存放各种类型的数据定义列表 语法: 变量名=[值1,值2,值3...值n]name=["唐僧","猪八戒","孙悟空","沙僧"]列表-查 值 = 列表[index] 根据索引下标查找值 index = 列表.index(值) 从列表中找出某个值第一个匹配项的索引位置 count = 列表.count(值) 统计某个元素在列表中出现的次数 lenth = len(列表) 查询列表的长度,元素的个数 max(列表) ,min(列表) 查询列表中的最大值,最小值列表-增 列表.append(值) 新增到末尾 列表.insert(下标,值) 6/48 插入到指定位置 列表.extend(列表) 列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。列表-改 列表[下标] = 值 根据下标修改其值列表-删 列表.pop() 删除末尾元素,并返回此元素 列表.pop(下标) 根据元素下标删除,并返回次元素 del 列表[下标] 根据元素下标删除 列表.remove(值) 根据元素的值删除列表-判断 in(存在) 如果存在那么结果为True,否则为False not in(不存在) 如果不存在那么结果为True,否则False列表-运算符 + * + 和 * 的操作符与字符串相似。 + 号用于组合列表,* 号用于重复列表。 7/48列表-排序 列表.reverse() 反向列表中元素 列表.sort() 对原列表进行排序,如果指定参数,则使用比较 函数指定的比较函数列表-切片 列表[num1:num2:num3] num1,num2都是列表的下标num3是间隔返回一个新的列表列表-遍历 使用while循环遍历 使用for循环遍历元组TuplePython的元组与列表类似,不同之处在于元组的元素不能 修改。元组使用小括号,列表使用方括号。元组的功能 = 列表不修改的功能元组和列表转化列表和元组相互转换8/48 列表 = list(元组) 元组转列表 元组 = tuple(列表) 列表转元组 注意:这两个方法都是得到一个新的,不会修改原来的字典DictPython内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储, 具有极快的查找速度。定义字典 格式: 字典 = {key1 : value1, key2 : value2 ......} 键必须是唯一的,但值则不必。 值可以取任何数据类型,如字符串,数字或元9/48组。 dict内部存放的顺序和key放入的顺序是没有关系的。字典-增/改 字典[键] = 值 如果次key不存在,就是往字典里新增一个键值对; 否则,就是修改由于一个key只能对应一个value, 所以,多次对一个key放入value,后面的值会把 前面的值冲掉字典-删 1.字典.pop(键) 根据键,删除指定的值,并将此值返回 2.del 字典[键] 根据键,删除指定的值 3.字典.popitem() 随机删除一个 4.字典.clear() 清空字典里的键值对字典-查 值 = 字典[键] 根据键查询值 字典.get(键,[默认值]) 通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的值 len(字典)10/48 计算字典元素个数,即键的总数。 str(字典) 输出字典可打印的字符串表示。 dict.keys() 以列表返回一个字典所有的键 dict.values() 以列表返回一个字典所有的值 dict.items() 以列表返回可遍历的(键, 值) 元组数组字典-判断 键 in 字典 如果键在字典中存在,返回True否则,返回False字典-遍历 使用for循环遍历的三种方式: for key in dict: print('%s:%s'%(key,dict[key]))for key in dict.keys(): print('%s:%s'%(key,dict[key]))for k,v in dict.items(): print('%s:%s'%(k,v)字典-其他方法 dict.copy() 返回一个新的字典,内容一样,地址不同 dict.fromkeys(seq[, val])) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值 dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default如果键在字典中,返回这个键所对应的值。如果键不在字典中,向字典中插入这个键,并且以default为这个键的值,并返回 default。default的默认值为None11/48 dict.update(dict2) 把字典dict2的键/值对更新到dict里字典与列表对比 和list比较,dict有以下几个特点: 查找速度极快,不会随着key的增加而变慢; 需要占用大量的内存,内存浪费多。 而list: 查找和插入的时间随着元素的增加而增加; 占用空间小,浪费内存很少。 所以,dict是用空间来换取时间的一种方法。Set集合set集合是一个无序,不能重复的集合容器,所以可以用来过滤重复元素。定义Set集合 语法: 变量名 = {值1,值2,值3.......}names={"张三","李四","王五","赵六 12/48Set集合-增 set.add(值) 添加元素 set.update(值) 将一个可迭代的内容,一一加入Set集合-删 set.remove(值) 移除指定的值 如果移除的值不存在 会报错 set.discard(值) 移除指定的值 如果移除的值不存在 也不会报错 set.pop() 随机删除一个元素 set.clear() 移除set中的所有的元素Set集合-其他操作 | 并集 & 交集 intersection 交集 - 差集 difference 差集 in 判断 union 联合 issubset 子集 issuperset 父集 13/48总结数据结构列表的使用元组的不可变性列表和元素相互转换字典键值对set值唯一本章作业1.两个列表进行合并操作2.使用列表判断一个列表是否在另外一个列表中3.列表的反转4.列表的排序14/485.实现对列表的增删改查功能6.如何将0-10随机存入列表中7.求出元组(90,34,-23,18,12)中的最大值和最小值8. 针对列表[90,34,-23,18,12]从小到大进行排序,然后 输出排序后结果9. 编程输出所有的三位水仙花数 水仙花数:各位数字的立方数相加等于该数本身 例如 153 1*1*1+5*5*5+3*3*3=153 153就是一个三位水仙花数10.为哈希表追加不重复的100个值,且每个值都是1-100之间的随机数,问哪个数字重复的次数最多,重复了多少次?11.假定书籍的种类有5种,设计何种的数据结构可以达到 快速查询某类所有书籍的功能(提示:用Dictionary)
思考题:
1.如何实现一个单向链表
2.解析用户输入的一个算数表达式 算出其结果(选作)
2-1.没有括号和负号(中等难度)
2-2.带括号和负号(高难度)
3.如何用队列实现约瑟夫环
约瑟夫环:假设有n个人坐成一圈,从某个人开始报数,
数到m的人出圈,接着从出圈的下一个人开始重新报数,
数到m的人再次出圈,如此反复,直到所有人都出圈,请 列出出圈顺序。
6日期时间
时间模块
15/48
在我们平常的代码中,经常需要和时间打交道。
在Python中,与时间处理相关的模块有:
time、datetime以及calendar,这里讲解time
模块模块的引入:import time
time中常用函数:
time.time()
返回当前时间的时间戳(1970纪元后经过的浮
点秒数)。
time.ctime()
获取当前日期时间
time.localtime()
将一个时间戳转换为当前时区的
struct_time,即时间数组格式的时间
time.sleep(secs)
线程推迟指定的时间运行
time.timezone
是当地时区(未启动夏令时)距离格林威治的
偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
time.tzname
包含一对根据情况的不同而不同的字符串,分 别是带夏令时的本地时区名称,和不带的。
time.altzone
返回格林威治西部的夏令时地区的偏移秒数。
如果该地区在格林威治东部会返回负值(如西欧,包括英
国)。对夏令时启用地区才能使用。
time.asctime([tupletime]) 接受时间元组并返
回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008
16/48
年12月11日 周二18时07分14秒)的24个字符的字符串。
time.clock( ) 用以浮点数计算的秒数返回当前
的CPU时间。用来衡量不同程序的耗时,比time.time()更
有用。
time.gmtime([secs]) 接收时间戳(1970纪元
后经过的浮点秒数)并返回格林威治天文时间下的时间元
组t。注:t.tm_isdst始终为0
time.mktime(tupletime) 接受时间元组并返回
时间戳(1970纪元后经过的浮点秒数)。
time.strftime(fmt[,tupletime]) 接收以时间元
组,并返回以可读字符串表示的当地时间,格式由fmt决
定。
time.strptime(str,fmt='%a %b %d %H:%M:
%S %Y') 根据fmt的格式把一个时间字符串解析为时间元
组。
time.tzset() 根据环境变量TZ重新初始化时间
相关设置。
时间元组:
Python函数用一个元组装起来的9组数字表示时间:
t=(2018,1,2,3,4,5,1,22,0)
17/48
日期格式化
time.strftime(format[, tupletime]):
把一个代表时间的元组或者struct_time(如由
time.localtime()和time.gmtime()返回)转化为格式化的
时间字符串。如果t未指定,将传入time.localtime()。如果
元组中任何一个元素越界,ValueError的错误将会被抛
18/48
出。
19/48
20/48
日期时间模块
日期时间——datetime
日期模块的引入:from datetime import datetime
获取当前日期对象
datetime.now()
设置日期获取日期对象
datetime(year, month, day [,hour, minute, second])
日期时间字符串的转换
日期时间<==>字符串
日期转换字符串
datetime.strftime(“%Y-%m-%d %H:%M:%S”)
from datetime import datetime
dt=datetime.now()
t=dt.strftime("%Y{y}%m{m}%d{d} %H:%M:%S").format(y="年",m="月",d="日")
print(t)
字符串转换日期
datetime.strptime(“2017-10-01 00:00:00”,“%Y-%m-%s %H:%M:%S”)
日历模块
21/48
日历(Calendar)模块
此模块的函数都是日历相关的,例如打印某月的字符月
历。
星期一是默认的每周第一天,星期天是默认的最后一天。
更改设置需调用calendar.setfirstweekday()函数。模块包
含了以下内置函数:
calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,
间隔距离为c。 每日宽度间隔为w字符。每行长度为21*
W+18+2* C。l是每星期行数。
calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入
caendar模块时返回0,即星期一。
calendar.isleap(year)
是闰年返回True,否则为false。
calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。
calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行
标题,一周一行。每日宽度间隔为w字符。每行的长度为
7* w+6。l是每星期的行数。
calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一
个星期的整数。Year年month月外的日期都设为0;范围内
22/48
的日子都由该月第几日表示,从1开始。
calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二
个是该月的日期码。日从0(星期一)到6(星期日);月
从1到12。
calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w,l,c).
calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.calendar(year,w,l,c)。
calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期
日)。
calendar.timegm(tupletime)
和time.gmtime相反:接受一个时间元组形式,返回该
时刻的时间戳(1970纪元后经过的浮点秒数)。
calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。
月份为 1(一月) 到 12(12月)。
总结
时间模块
日期时间模块
日期时间字符串的转换
日历模块
本章作业
1.输入一个日期,格式如:2010 10 24 ,判断这一天是这
23/48
一年中的第几天。
2.已知2011年11月11日是星期五,输入日期 ,问YYYY年
MM月DD日是星期几
3.系统会随机给你一个日期(yyyy-MM-dd)字符串,你需 要计算这个时间上一个月的最后一天的具体日期,最后以
yyyy年MM月dd日的字符形式返回
4.输入两个日期,获得两个日期相差几天,几小时,几秒
7函数
掌握方法的声明、定义,以及参数和返回值的含义;
函数的介绍
什么是方法?
广义:一般是指为获得某种东西或达到某种目的而采取的
手段与行为方式。
狭义:方法是指由一系列的程序语句组成的代码块
方法(method)也叫函数(function),就是将一堆代码 进行重用的一种机制。函数就是一段代码,这段代码可能
有输入的值(参数),可能会返回值。一个函数就像一个
专门做这件事的人,我们调用它来做一些事情,它可能需
要我们提供一些输入信息给它,它执行完成后可能会有一
些执行结果给我们。要求的输入的信息就叫参数,返回的
执行结果就是返回值。
str=input("请输入名字")就是一个有返回结果的函数;
print("hello")就是一个有执行参数的函数,只有告诉print
被打印的数据它才知道如何打印;str2=str.find("a")则是
一个既有参数又有返回值的函数。
有了函数写代码就像拼积木,python中的各种各样的技术
24/48
其实就是通过for、if等这些基础的语法将不同的函数按照
一定的逻辑组织起来。
方法有什么好处?
重用
无论现实世界还是程序世界,都以方法来达到重用的目的
函数的定义与调用
定义语法:
def 函数名([参数]):
代码块
[return 表达式]
命名规则:方法名开头大写,参数名开头小写,方法名、
参数名、变量名要有意义;
方法的目的在于重用,所有的方法编写完成后,都处于等
待调用状态,被调用后方法开始执行,直到方法返回(有
无返回值均必须返回)
方法大多数会在其他方法内部被调用
def FirstMethod():
print("我是一个方法")
FirstMethod()
25/48
多级调用关系在程序中表现如下:
===>:调用
<===:返回
Method1()<===>Method2()<===>Method3
()<===>Method4()
栈:后进先出的一种存储结构
执行过程如下:
1.Method1()执行到调用Method2()的调用点时 方法被阻
塞 Method1()进入调用堆栈
2.Method2()执行到调用Method3()的调用点时 方法被阻塞 Method2()进入调用堆栈
26/48
3.Method3()执行到调用Method4()的调用点时 方法被阻塞 Method3()进入调用堆栈
4.Method4()开始执行 执行完毕后 返回结果给调用堆栈
5.调用堆栈收到返回值后,将栈顶也就是Method3()出栈继续执行并返回
27/48
6.调用堆栈收到返回值后,将栈顶也就是Method2()出栈继续执行并返回
7.调用堆栈收到返回值后,将栈顶也就是Method1()出栈继续执行并返回
28/48
8.堆栈为空 本次多级调用执行完毕
注意:所有的方法均需要返回?为什么有的方法没有return?
无返回值的方法可以将return;省略
形式参数与实际参数
参数分为两种:
形式参数:在编写方法的时候 预定义的参数
实际参数:在实际调用(使用)方法的时候 传入方法的参
数
参数的类型:
形式参数:任意的数据类型 由方法编写者在预定义时限定
实际参数:任意的数据类型(和形式参数匹配)在方法的
调用者中定义赋值
简单示意:
形式参数:
29/48
#radius即为形式参数
def Area(radius):
return 3.14*radius*radius
实际参数:
#r即为实际参数
r=1
area=Area(r)
print("面积为%s"area)
传参的实质: radius = r;
将实际参数传递给形式参数
函数的返回值
返回值类型:任意的数据类型
方法有无返回值取决于方法的调用者是否需要返回值
1.读取用户输入的整数,如果用户输入的是数字,则返回输
入的值,否则提示用户重新输入。
2.查找两个整数中的最大值
3.计算输入列表所有元素的和:
思考:
写一个方法,计算一个int类型list中每个元素的总和 、最大
值与最小值?
局部变量与全局变量
30/48
全局变量与局部变量
两者的本质区别就是在于作用域;
用通俗的话来理解的话,
全局变量是在整个py文件中声明,全局范围内都可以访问
局部变量是在某个函数中声明的,只能在该函数中调用
它,如果试图在超出范围的地方调用,程序就挂掉了
如果在函数内部定义与某个全局变量一样名称的局部变
量,就可能会导致意外的效果,可能不是你期望的。因此
不建议这样使用,这样会使得程序很不健全
直接来看几个例子来理解全局变量和局部变量的区别吧:
def fun(x):
y=2
print("乘法的运行结果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)
报错的原因是因为试图访问局部变量,但是访问的地方不在该变量y的作用域中
def fun():
num1=2
print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)
可以看到在函数内部对全局变量的修改后,在函数执行完
毕,修改的结果是无效的,全局变量并不会受到影响
31/48
global关键字
如果真的想要在函数体内修改全局变量的值,就要使用
global关键字
def fun():
global num1
num1=2
print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)
使用global关键字就是告诉python编译器这个变量不是局
部变量而是全局变量,其实有点像是"引用"的意思
32/48
可选参数
含义:可选参数,也成为默认参数,是指给方法的特定参
数指定默认值,在调用方法时可以省略掉这些参数。
注意事项:
(1)可选参数不能为参数列表的第1个参数,必须位于所 有的必选参数之后(除非没有必选参数);
(2)可选参数必须指定一个默认值,且默认值必须是一 个常量表达式,不能为变量;
(3)所有可选参数以后的参数都必须是可选参数。
(4)若要为可选参数传递新的值 ,注意数据类型
示例:
def Add(a,b=2):
result = a + b
return result
a = 10
#省略b实际参数的传递
Add(a)
#也可以不省略 为b重新赋值
Add(a,5)
命名参数
命名参数,也可以叫关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的
关键字参数。至于到底传入了哪些,就需要在函数内部通
过kw检查。
33/48
注意:如果要限制关键字参数的名字,就可以用命名关键
字参数
例:
def person(name, age, *, city="北京", job="程序猿"):
print(name, age, city, job)
person("托尼",15,city="郑州",job="主播")
可变元组参数
在Python函数中,还可以定义可变参数。顾名思义,可变
参数就是传入的参数个数是可变的,可以是1个、2个到任
意个,还可以是0个,调用时可以传入个数不同的实参,具
备很好的灵活性。参数组装成一个tuple
参数数组必须为参数列表的最后一个参数
参数列表之前可以设置其他的参数
示例:
def Add(*tuple):
sum=0
for i in tuple:
sum+=i
return sum
#调用使用了参数数组的方法
Add()
Add(1,3,5)
Add(1,3,5,7)
34/48
可变字典参数
可变参数允许你传入0个或任意个参数,这些可变参数在
函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,
这些关键字参数在函数内部自动组装为一个dict。
例如
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person("蒋昊",18,gender="男")
匿名函数
匿名函数
顾名思义就是指:是指一类无需定义标识符(函数名)
的函数或子程序。
定义
语法格式:lambda 参数:表达式
lambda语句中,开头先写关键字lambda,冒号前是 参数,可以有多个,用逗号隔开;冒号右边的为表达式,
需要注意的是只能有一个表达式。由于lambda返回的是函
数对象(构建的是一个函数对象),所以需要定义一个变
量去接收。
注意点:lambda 函数可以接收任意多个参数 (包括可选
参数) 并且返回单个表达式的值。lambda 函数不能包含命
35/48
令,包含的表达式不能超过一个。
匿名函数优点:
使用Python写一些脚本时,使用lambda可以省去定义
函数的过程,让代码更加精简。
对于一些抽象的,不会被别的地方再重复使用的函
数,有时候函数起个名字也是个难题,使用lambda不需要
考虑命名的问题
使用lambda在某些时候然后代码更容易理解
nums=(1,2,53,6,69)
a=lambda x: max(x)
print(a)
print(type(a))
print(a(nums))
递归函数
递归算法的思想
递归算法是把问题转化为规模缩小了的同类问题的子问
题。然后递归调用函数(或过程)来表示问题的解。在C
语言中的运行堆栈为他的存在提供了很好的支持,过程一
般是通过函数或子过程来实现。
递归算法:在函数或子过程的内部,直接或者间接地调用
自己的算法。
递归算法的特点:
递归算法是一种直接或者间接地调用自身算法的过程。在
计算机编写程序中,递归算法对解决一大类问题是十分有
效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
36/48
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条 件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运 行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部
量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
所以一般不提倡用递归算法设计程序。
递归算法的要求
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次
做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行
递归调用,因而每次递归调用都是有条件的(以规模未达到
直接解答的大小为条件),无条件递归调用将会成为死循环
而不能正常结束。
简单步骤:
1.明确确定方法的功能含义
2.明确方法出口
3.在使用中遇到符合方法功能定义的地方调用方法
求阶乘! n! = n*(n-1)!
f(n) = f(n-1)!*n
5! = 5*4*3*2*1
37/48
def Factorial(num):
print(num)
if num<2:
return num
else:
return Factorial(num-1)*num
print(Factorial(6))
斐波那契数列
迭代求法1 1 2 3 5 8 13 21 34 55
递归深度
获得深度值:
import sys
sys.getrecursionlimit()
1000
当递归深度超过这个值的时候,就会引发这样的一个异
常。
解决的方式是手工设置递归调用深度,
方式为
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万
38/48
总结
函数的介绍
函数的定义和调用
函数的4种类型
函数的参数
变量作用域
递归函数
匿名函数
函数式编程
本章作业
必做:
1、写一个方法,在方法内依次打印出列表每个元素的
值。
2、写一个方法,计算列表所有元素的和(注意返回值)。
3、写一个方法,计算列表所有奇数下标元素的和(注意返
回值)。
4、写一个方法,计算列表所有偶数下标元素的和(注意返
回值)。
5、写一个方法可以计算两个数的和,想想这个方法有哪
些参数,返回值。
39/48
6、写一个方法可以计算两个数的商(分母不能为0),想想 这个方法有哪些参数,返回值是什么。
7、写一个方法将传入的天、小时、分钟、秒的总和转换
为秒,比如0天、2小时、5分、7秒,他们代表的总秒数为
2*3600+5*60+7=7507秒。想想这个方法有哪些参数,
返回值是什么类型。
8、写一个方法交换整型列表中两个指定下标元素的值。
想想这个方法有哪些参数,返回值是什么类型。
9、写一个方法计算整型列表中所有能被3整除元素的个
数。想想这个方法有哪些参数,返回值是什么类型。
10、写一个方法将整型数字(int)转换为格式化的字符串
(string),现要求如下:
a.可以指定转换后[字符串的长度];
b.当数字的长度不足指定的长度,让这个字符串右对齐,
指定[左边补的字符(char)];
例如,假设现在将指定的数字转换为固定长度为8的字符
串,如果长度不足,左边补'0',那么27这个数字就会转换
为字符串"00000027"。
根据要求,想想这个方法有哪些参数,返回值是什么类
型。
11.用方法实现找出一个int类型列表中最大值和最小值
12.判断一个数是否是质数(素数)?该如何声明方法?
13. 将指定的秒数转变为几小时几分几秒。
14.使用Random类给一个数组的所有元素赋随机初值(不
重复)。
40/48
15.判断一个整型数组是否是对称的。所谓对称就是第一
个元素等于最后一个元素,第二个元素等于倒数第二个元
素,依次类推,例如【7,3,1,3,7】就是对称的。
16.打印一个元组的所有值。
17.查找一个元组中某个值是否存在,如果存在返回这个
值的索引,否则返回-1。
18.将一个列表反转过来,比如【2,3,1,4,7】转换为
【7,4,1,3,2】
19.求一个列表的最大值。
20.求一个列表的最小值。
21.写一个方法,实现在列表中指定的的位置前插入一个
值。
22.写一个方法,删除列表中指定位置的元素。
23.猜数游戏
1.随机出现一个数(范围自定义) 作为答案
2.提示用户输入并根据答案和用户输入的大小关系输出大
了? 小了?
3.5次机会
4.可以重复玩
5.根据猜对的次数进行评价
6.无论对错 请告知答案
8系统模块
模块的概念
模块的引入
系统模块os
操作模块sys
数学模块math
41/48
模块的概念
模块 是一个设计术语,是指对词条中部分内容进行格式化
整理的模板。
例如歌手类词条中的“音乐作品”模块,电视剧类词条的“分
集剧情”模块。
在程序设计中,为完成某一功能所需的一段程序或子程序;
或指能由编译程序、装配程序等处理的独立程序单位; 或指大型软件系统的一部分。
模块,又称构件,是能够单独命名并独立地完成一定功能的
程序语句的集合(即程序代码和数据结构的集合体)。
它具有两个基本的特征:外部特征和内部特征。
外部特征是指模块跟外部环境联系的接口(即其他模块或
程序调用该模块的方式,包括有输入输出参数、引用的全
局变量)和模块的功能;
内部特征是指模块的内部环境具有的特点(即该模块的局
部数据和程序代码)。
Python 模块(Module),是一个 Python 文件,以 .py 结
尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更
易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代
码。
模块的引入
42/48
模块的引入
import 语句
模块定义好后,我们可以使用 import 语句来引入模块
引入模块的语法:
import Module[, module2[,... moduleN]
一次可以引入多个模块,但是一般情况下 我们一次只引
入一个模块.
当解释器遇到import语句,如果模块在当前的搜索路径 就会被导入。
比如要引用模块 math,就可以在文件最开始的地方用
import math 来引入。
在调用 math 模块中的函数时,必须这样引用:模块
名.函数名一个模块只会被导入一次,不管你执行了多少次
import。这样可以防止导入模块被一遍又一遍地执行。
有时候我们只需要用到模块中的某个函数,只需要引入
该函数即可,此时可以用下面方法实现:
from 模块名 import 函数名1,函数名2....
不仅可以引入函数,还可以引入一些全局变量、类等
通过这种方式引入的时候,调用函数时只能给出函数 名,不能给出模块名,但是当两个模块中含有相同名称函
数的时候,后面一次引入会覆盖前一次引入。
也就是说假如模块A中有函数function( ),在模块B中
43/48
也有函数function( ),如果引入A中的function在先、B中
的function在后,那么当调用function函数的时候,是去执
行模块B中的function函数。
如果想一次性引入math中所有的东西,还可以通过
from math import *来实现
系统模块os
python编程时,经常和文件、目录打交道,这是就离不了
os模块,os模块包含普遍的操作系统功能,与具体的平台无
关.os 模块提供了非常丰富的方法用来处理文件和目录.
常用的如下:
os.path 获取该模块的路径
os.name 获取现在正在实用的平台,Windows 返回 ‘nt';
Linux 返回’posix'
os.rename(originPath, targetPath) 重命名
os.remove(path) 删除文件
os.mkdir(str) 创建文件夹
os.makedirs(path) 创建多个文件夹
os.getcwd() 获得当前路径
os.chdir("../") 改变默认目录
os.listdir("./") 获取目录列表
os.rmdir(path) 删除文件夹
获取指定路径下的文件
44/48
def f2(ph):
#获取指定路径下的文件夹和文件
file_list=os.listdir(ph)
#遍历file_list集合
for f in file_list:
file=ph+os.sep+f
#如果是文件,直接打印文件名称
if os.path.isfile(file):
print('这是一个文件:%s'%file)
#如果是文件夹
if os.path.isdir(file):
print('这是一个文件:%s'%file)
f2(file)
ph=input('请输入路径:')
f2(ph)
批量修改文件名
45/48
import os
import os.path
#得到完整路径
path=input('请输入完整的路径:')
#获取此路径下的列表
all_file=os.listdir(path)
#改变当前的工作路径
#遍历
for file in all_file:
#拼接路径 将多个路径组合后返回
old_path=os.path.join(path,file)
#判断是否是文件
if os.path.isfile(old_path):
index=file.rfind('.')
#处理名字
new_name=file[0:index]+'-new'+file[index:]
else:
new_name=file+"-new"
new_path=os.path.join(path,new_name)
#重命名
os.rename(old_path,new_path)
获得所有文件
46/48
#获得文件夹里的所有内容
#递归思路 在树形结构目录里经常使用
path=r"C:\Users\Administrator\Desktop"
def GetAllFile(path):
#不是目录就跳出
if os.path.isdir(path):
pathList = os.listdir(path)
#是空目录 也跳出来
if len(pathList) > 0:
for i in pathList:
tempPath = os.path.join(path, i)
print(tempPath)
#递归 调用自己
GetAllFile(tempPath)
GetAllFile(path)
操作模块sys
sys模块提供了一系列有关Python运行环境的变量和函数
sys模块常用的功能:
sys.argv 获取当前正在执行的命令行参数的参数列表(list)
sys.platform 获取当前执行环境的平台,如win32表示是
Windows 32bit操作系统,linux2表示是linusys.path 在
python启动时,
sys.path根据内建规则、PYTHONPATH变量进行初始化。
sys.builtin_module_names 返回一个列表,包含内建模块
47/48
的名字
sys.exit(n) 调用sys.exit(n)可以中途退出程序,当参数非
0时,会引发一个SystemExit异常,从而可以在主程序中 捕获该异常。
数学模块math
python中math模块中提供的基本数学函数
sin(x):求x的正弦
cos(x):求x的余弦
asin(x):求x的反正弦
acos(x):求x的反余弦
tan(x):求x的正切
atan(x):求x的反正切
fmod(x,y):求x/y的余数
ceil(x):取不小于x的最小整数
floor(x):求不大于x的最大整数
fabs(x):求绝对值
pow(x,y):求x的y次幂
log10(x):求x的以10位底的对数
sqrt(x):求x的平方根
factorial(x) 求x的阶乘
trunc(x) 求x的整数部分
总结
模块的概念
模块的引入
48/48
系统模块os
操作模块sys
数学模块math
本章作业
必做:
1.当前程序目录下创建py文件夹,目录里创建十个子文件
夹,并且命名为1-10
2.在子文件夹1-10里,偶数文件夹下创建新文件夹,命名
end
3.将子文件夹中2,4,8里的end重命名为end2,end4,
end8
4.删除子文件2
5.打印py文件夹中所有文件夹名称
6.删除py及其所有子文件夹
7.浮点数20.73,向上取整,向下取整,正弦值
8.弧度π/4,π/2,对应的度数