Python函数调用的大致步骤,Python函数作业
Yyds干货库存
Python函数进阶与文件操作一、作业复习1。在打印格式和百分比符号下面的结果中,“50%通过”语句可以正常输出为(B)
a、print( %d\% pass% (50))=回答大部分结果(Python写的不对)
b,打印(%d%%通过% (50))=正确的结果
2.string slice定义了一个string str1=abcdefg ,用slice截取string str1[3:-2]并找到返回的结果:(C)
c 、 db
3.字典的定义其实字典中的键可以是很多数据类型(不可变数据类型=整数、浮点、字符串、元组)
my _ dict={ } my _ dict[1]=1my _ dict[ 1 ]=2my _ dict[1.0]=3 print(my _ dict[1]my _ dict[ 1 ]my _ dict[1.0])II .参考变量和变量
谈内存底层变量的存储形式a=10第一步:首先在计算机内存中创建一个值10(占用一个内存空间)
步骤2:在堆栈空间中声明一个变量,比如。
第三步:把值10的内存地址给变量小A,形成所谓的==“引用关系”==
Python中如何验证变量的引用关系答:可以使用内置方法id(),其参数是要显示的变量信息=id(变量名)
A=10print(id(a))将一个变量赋予另一个变量的影响a=10b=aprint(id(a))print(id(b))运行结果:
注:从上面的运行结果可以看出,当我们将一个变量赋给另一个变量时,两个变量指向同一个内存地址。说明A和B指向同一个内存空间。示意图如下:
思考:如果我们在b=a后改变变量A的值,请问变量B会受到影响吗?
# a=10 # print(id(a))a=10b=aa=100 print(b)# 10或100print(id(a))print(id(b))示意图:
总结:不可变数据类型(数值)赋值后,一个值的变化不会影响另一个变量,因为它们指向不同的空间地址。
2.Python中的可变和不可变数据类型1:Python中有多少种数据类型?答案:七种,数值型(int integer,float浮点型)、bool型(True and False)、字符串型(str)、tuple (tuple 1,2,3)、list (list [1,2,3])、dict(key:value })、set (set {
在Python中,我们可以将七种数据类型分为两类:可变类型和不可变类型。
不可变类型
数值(int整数,float浮点类型)
bool类型(真和假)
字符串类型(str)
元组(元组1,2,3,2,3)
可变型
列表(列表[1,2,3])
字典(dict {key:value})
集合(集合{1,2})
问题2:如何判断一个数据类型是可变的还是不可变的?在Python中,可变和不可变类型主要由内存中这种数据类型的表示来定义。
==可变类型在内存中。一旦它的内存地址固定,它的值就可以改变==
A=[1,2,3]print(id(a))#向内存追加新数据(数据只能按数据类型更改。方法())a.append(4)print(id(a))原理图:
==不可变类型在内存中。一旦内存地址固定,它的值就不能以任何方式改变==
a=10 print(id(a))a= hello print(id(a))示意图:
3.可变类型和不可变类型在函数中的应用#定义一个函数def func(names): print(names)#定义一个全局变量names=[张三,李四,王五] #调用函数func(names)示意图:
总结:在一个函数中,如果全局或局部地添加或删除可变类型,其外部和内部都会受到影响。
不可变类型#定义一个函数def func(num): num=1 print(num)#定义一个全局变量a=10#在全局范围内调用函数func(a)# Print aprint(a)
综上所述:函数中的不可变类型,局部或全局的改变对外部或内部都没有影响。
三、函数递归(重点难点)1。前言编程思路:如何利用数学模型解决相应的需求问题;然后,通过代码实现相应的数据模型。
算法:用代码实现相应的数学模型,从而解决相应的业务问题。
程序=算法数据结构
在我们经常使用的算法中,有两种常用的算法:递归算法和递归算法,专门用来解决一些拆分后相似度非常高的复杂程序。
2.递归算法递归算法:递归算法是一种简单的算法,即通过已知的条件,利用特定的条件进行中间推断,直到得到结果。递归分为前推和后推。
向前推:通过最简单的条件,然后一步步推导出结果。
逆向推导:通过结果找到规律,然后推导出已知条件。
递归算法案例:斐波那契数列
1 1 2 3 5 8 13 21 .
.
第一位是1,第二位是1,第三位是2=1 1,第四位是3=2 1,依此类推.第n位的结果是什么?
f(n)=f(n-1) f(n-2)
提问:求斐波那契数列的第15个结果?
解析:f(15)=f(14) f(13)
f(14)=f(13) f(12)
f(13)=f(12) f(11)
.
f(4)=f(3) f(2)=3 1
f(3)=f(2) f(1)=2
f(2)=1
f(1)=1
递归算法:使用while循环或for循环。
#递归算法:根据已知条件求结果(或根据结果求未知条件)def recusive(n):“”返回斐波那契数列中某一位(n=1)的结果“”如果n==1或n==2:返回1 #开始递归f(3)=f(2)f(1)f(4)=f .=f(14)f(13)dict 1={ 1:1,2:1}对于区间(3, 1):# f(3)=f(2)f(1)# f(I)=f(I-1)f(I-2)dict 1[I]=dict 1[I-1]dict 1[I-2]递归dict1 [n] #函数调用作为一种算法,递归被广泛应用于编程语言中。 它通常==将一个大而复杂的问题逐层转化为一个与原问题相似的更小的问题来求解==。递归策略只需要少量的程序来描述解题过程中所需的重复计算,大大减少了程序的代码量。
简化问题:找到最优子问题(不能再小了)函数调用自身。
Def func(): #自称func()func()4。递归有两个非常重要的概念:
==递归点==:找到解决当前问题的等价函数(先求解比当前问题规模小的函数,以此类推,最终实现问题的求解)=有回报。
==递归退出==:问题求解时,已经达到最优问题(必须存在),不能再调用函数。
注意:如果一个递归函数没有递归出口,它将成为一个无限循环。
5.写递归三步==明确你想用这个函数做什么==
比如求斐波那契数列。
==求递归结束条件==
比如什么情况下递归会停止循环并返回结果?
==求函数的等价关系==
比如斐波那契数列,第n位f(n)=f(n-1) f(n-2)
案例1:递归求解斐波那契数列
第一步:明确这个函数想要做什么(首先定义它,明确如何调用它)
#斐波那契数列1 1 2 3 5 8 13 21.def f(n): #写递归代码求第n位结果#调用函数print(f(15)) # 610第二步:求递归的结束条件
#斐波那契数列1 1 2 3 5 8 13 21.def f(n): #写递归代码求第n位的结果如果n==1或者n==2:返回1#调用函数print(f(15)) # 610第三步:找出函数的等价关系(最关键的一步)
#斐波那契数列1 1 2 3 5 8 13 21.def f(n): #写递归代码求第n位的结果如果n==1或n==2: return 1 #求等价关系return f(n-1) f(n-2)#调用函数print (f (15)) # 60
什么是阶乘?正整数的阶乘是所有小于等于该数的正整数的乘积,如:n!=123.(n-1)n
1!=1
2!=1x2=2
3!=1x2x3=6
4!=1x2x3x4=24
.
n!=123.(n-1)n
第一步:明确这个函数要做什么,定义函数,如何调用。
Def f(n): #写递归条件print(f(100))第二步:求递归的结束条件。
Def f(n): #写递归结束条件如果n=2:返回n #.递归方程打印(f(100))第三步:写出递归等价公式(你得自己调用)
等价公式=发现定律
1!=f(1)=1
2!=f(2)=2
3!=f(2)x3=6
4!=f(3)x4=24
.
n!=f(n-1) * n
Def f(n): #写递归结束条件如果n=2:返回n #.递归方程return f(n-1) * nprint(f(100))案例三:面试问题=猴子吃桃问题
猴子吃桃子。第一天,猴子摘了许多桃子,马上吃了一半,但是不够,所以他又吃了一个。第二天早上,我吃了一半剩下的桃子,又吃了一个。每天早上,我把前一天剩下的都吃了,再加一个。到第10天早上,只剩下一个桃子了。第一天摘了多少桃子?
第一步:确定函数要执行什么功能,要传递什么参数,确认调用方法。
Def f(n): #写递归代码#调用f函数print(f(1))第二步:写递归的结束条件(exit)。
#第一步:确定函数def f(n): #第二步:写递归结束条件(exit)如果n==10:返回1#调用函数print(f(1))。第三步:找出与这个问题相等的等式关系。
找到剩余数量的桃子?假设:假设有10个桃子。
第1天,吃10个桃子的一半,10/2=5 1=6。
第二天,吃4个桃子的一半,4/2=2 1=3。
第三天,我想再吃一个。
第n天,剩余桃子总数=(第(n-1)天剩余桃子数1) * 2
#第一步:确定函数def f(n): #第二步:写出递归结束条件(exit)如果n==10: return 1 #第三步:找到与此问题类似的等价公式return(f(n ^ 1)1)* 2 #调用函数print(f(8)) IV .表达式1,普通函数和匿名
所以在Python中,大多数函数都是命名函数=普通函数。但是,在某些情况下,为了简化程序代码,我们也可以定义匿名函数=lambda表达式。
2.lambda表达式应用场景如果一个函数有返回值且只有一段代码,可以用lambda简化。
3、lambda表达式基本语法变量=lambda函数参数:expression(函数代码返回值)# call variable variable () 4、写lambda表达式定义一个函数,经过一系列运算最后返回100。
DEF 1():返回100 #调用fn1函数print(fn1) #返回fn1函数在内存print中的地址(fn1()) #的意思是找到fn1函数的地址并立即执行。
用于简化的表达式:
Fn2=lambda: 100print(Fn2) #返回内存print(fn2())5中fn2的地址。写带参数的lambda表达式,写函数求两个数之和。
Def FN1 (Num1,num 2):Return num 1 num 2 Print(FN1(10,20))表达式简化:
2=lambda num1,num2: num1num2print (fn2 (10,20)) 6。lambda表达式的相关应用lambda表达式带缺省参数fn=lambda a,b,c=100: a b c print (fn (10,20))可变参数:可变参数* args fn 1=Lambda * args:arg split(fn1(10,20,30))可变参数:可变参数* * kwargsfn 2=Lambda * * kwargs:kwargs split(fn2(name= Tom ,age=20) Address=海淀区,北京))Lambda表达式带if判断fn=lambda,b: a if
students=[ {name: Tom , age: 20},{name: Rose , age: 19},{name: Jack ,Age :22 }]# students . sort(key=lambda x:x[ name ])print(students)# students . sort(key=lambda x:x[ name ])按姓名降序排列,Reverse=True)print(students)# students . sort(key=lambda x:x[ Age ])print(students)执行过程:
students=[ {name: Tom , age: 20},{name: Rose , age: 19},{name: Jack ,Age :22 }]# students . sort(key=lambda x:x[ name ])按姓名值的升序打印(学生)。Python 1中的高阶函数。什么是高阶函数?传入==函数作为参数。这样的函数称为高阶函数,是函数式编程的体现。函数式编程指的是这种高度抽象的编程范式。
2.Python中高阶函数的由来,abs()函数可以计算数字的绝对值。
正数的绝对值就是它本身负数的绝对值就是它的反义词。
abs()返回的结果都是正数。
Abs(-10) # 10round()函数可以完成数字的舍入计算。
Round(1.2) # 1round(1.9) # 2需求:任意两个数,按照规定的要求(绝对值四舍五入)对个数进行排序然后计算总和。
DEF FN1 (num1,num 2):RETURN ABS(num 1)ABS(num 2)PRINT(FN1(-10,10)) DEF FN2 (num1,num 2):RETURN ROUND(num 1)ROUND(num 2)PRINT(FN2(10.2,6.9))要求:
Fn (num1,num2,f): # f表示要传入的参数(参数为函数名,如abs或round) return f(num1) f(num2)#绝对和print(fn(-10,10,abs))# round print(fn(10.2,6.9,Round))3 .map()函数map(func,lst),将传入的函数变量func作用于lst变量的每个元素,并将结果作为新的list (Python2)/iterator (Python3)返回。
lst=[1,2,3]
Func函数:求一个数的平方,比如输入2返回4,输入3返回9。
Map(func,lst)返回结果[1,4,9]
#定义一个函数def func(n): return n ** 2#定义一个列表list1=[1,2,3]#使用map对lst list2=list (map (func,list1)) print (list2) 4,reduce()函数reduce(func,lst),每个func计算的结果继续与序列的下一个元素累加。注意:reduce()传入的参数func必须接收2个参数。
列表1=[1,2,3]
定义函数(a,b):
返回a b
Reduce(func,lst)将列表中的每个元素放入func中进行处理,然后相加。
Import functools#定义一个函数def func(a,b): return a b#定义一个list list list 1=[10,20,30,40,50] sums=functools.reduce (func,1) print (sums) 5、filter()函数filter(func,lst)函数用于过滤序列,过滤掉不合格的元素,返回一个filter对象。如果要转换成列表,可以使用list()进行转换。
#定义一个函数(获取所有偶数)def func(n): return n% 2==0#定义一个序列list1=[1,2,3,4,5,6,7,8]#调用filter函数进行过滤运算结果=filter (func,list1) print (list (result))要长期保存数据,需要使用硬盘、光驱、u盘等设备。为了方便数据管理和检索,引入了==“文件”==的概念。
一篇文章,一个视频,一个可执行程序都可以保存为一个文件,并给一个文件名。系统按文件管理磁盘中的数据。一般来说,==文件可以分为文本文件、视频文件、音频文件、图像文件、可执行文件等类别。==
2.思考:文件操作的内容有哪些?在日常操作中,我们主要对文件进行操作:创建文件、打开文件、读写文件、备份文件等等。
3.文件操作的作用文件操作的作用是==存储一些内容(数据)==,这样程序下次执行时就可以直接使用,不用再做一份拷贝,省时省力。
七。基本文件操作1。文件操作三步打开文件。
读写文件。
关闭文件。
2.open函数要在Python中打开文件,可以使用open()函数打开现有文件或创建新文件。语法如下:
F=open(name,mode)注意:返回的结果是file对象(后面会学到,只要记住后面的方法都是f. method())。Name:要打开的目标文件名的字符串(可以包括文件所在的具体路径)。
模式:设置打开文件的模式(访问模式):只读R、写W、追加A等。
r模式:意思是以只读模式打开一个已有的文件,然后我们就只能读取文件了。如果文件不存在,会直接报错。此外,当R模式打开一个文件时,它会将光标放在文件的一行上。
w模式:表示以只写模式打开文件。如果文件不存在,将自动创建。w模式主要是为文件写入而定义的。但需要注意的是,写入W模式时,光标也放在第一行,原文件内容会被清空。
模式A:表示以追加模式打开文件。如果文件不存在,将自动创建。模式主要是为文件写入定义的。但是,与W模式不同,A模式不会清空文件的原始内容,而是在文件末尾追加内容。
3.用写函数写文件的基本语法:
f . write(‘要写的内容要求是字符串类型的数据’)4。close函数关闭文件f.close()5。入门级案例# 1。打开文件f=open(python.txt , w)# 2。把内容写f . write(‘人生苦短,我学Python!’) # 3.关闭文件f.close()强调:中文乱码。默认情况下,计算机通常使用ASCII,GBK和UTF-8代码。
6.解决写中文乱码的问题# 1。打开文件F=open (python.txt , w ,编码= UTF-8) # 2。把内容写f . write(‘人生苦短,我去学Python!’) # 3.关闭文件f.close()7。文件的读取(大小)方法:主要用于读取文本类型或二进制文件的数据(图片、音频、视频.).
Size表示要从文件中读取的数据长度(以字节为单位)。如果没有传入size,则意味着读取文件中的所有数据。
F.read() #读取文件的所有内容f.read(1024) #读取文件的内容,长度为1024字节,字母或数字,其中一个长度为1字节。中文utf-8长度为3个字节。# 1、打开文件f=open (python.txt , r ,encoding= UTF-8) # 2、使用read()方法读取文件内容的全部内容=f.read () print (contents) # 3、关闭文件f.close()readlines()方法:主要用于
Readlines可以以行的形式一次读取整个文件的内容,并返回一个列表,其中每一行的数据都是一个元素。
# 1、打开文件f=open (python.txt , r ,encoding= UTF-8) # 2、读取文件lines=f . readlines()for line in lines:print(line,end=) # 3、关闭文件f.close()8、说说文件操作。指向文件的指针将放在文件的开头。这是默认模式。Rb以只读方式打开二进制格式的文件。文件指针将放在文件的开头。这是默认模式。r打开文件进行读写。文件指针将放在文件的开头。Rb打开一个二进制格式的文件进行读写。文件指针将放在文件的开头。打开一个只写的文件。如果文件已经存在,打开后从头编辑,即删除原内容。如果该文件不存在,请创建一个新文件。Wb以二进制格式打开一个文件,只允许写。如果文件已经存在,打开后从头编辑,即删除原内容。如果该文件不存在,请创建一个新文件。打开一个文件进行读写。如果文件已经存在,打开后从头编辑,即删除原内容。如果该文件不存在,请创建一个新文件。Wb以二进制格式打开文件进行读写。如果文件已经存在,打开后从头编辑,即删除原内容。如果该文件不存在,请创建一个新文件。打开一个附加文件。如果文件已经存在,文件指针将放在文件的末尾。也就是说,新内容将在现有内容之后写入。如果该文件不存在,请创建一个新文件进行写入。打开ab二进制格式的文件进行追加。如果文件已经存在,文件指针将放在文件的末尾。也就是说,新内容将在现有内容之后写入。如果该文件不存在,请创建一个新文件进行写入。打开一个文件进行读写。如果文件已经存在,文件指针将放在文件的末尾。文件打开时将处于追加模式。如果该文件不存在,请创建一个新文件进行读写。打开ab二进制格式的文件进行追加。如果文件已经存在,文件指针将放在文件的末尾。如果该文件不存在,请创建一个新文件进行读写。虽然模式文件操作有很多种模式,但我们只需要记住3个字符。r、w、a
r,W,A,加号,功能齐全,能读写(区别是指针指向不同的点)
Rb、wb、ab,字符为B,代表二进制操作,适用于读取文本或二进制格式文件,如图片、音频、视频等格式。
Rb,wb,ab,加号,功能齐全,能读写(区别是指针指向不同的点)
9.无论是文件读取操作还是写入操作,seek函数都会移动光标。它的起始位置由文件光标决定。
R=文件头
W=清空文件内容并指向文件头。
A=文件结尾
当光标刚打开一个文件时,默认按照R、W、A模式固定。但是我们可以通过一些方法人为的移动光标。可以通过seek方法实现。
F.seek (offset,当=0时)offset:起始偏移量,即需要移位的字节数。When:给offset参数一个定义,指明从哪里开始偏移;0表示从文件的开头开始,1表示从当前位置开始,2表示从文件的结尾开始。实际上,seek主要用于将光标重置到起始位置。
f.seek(0)或f.seek(0,0)的其他应用:
F=open (workfile , Rb )f . Write(B 0123456789 abcdef )16F。Seek (5) #从0向右移动5个字节5 f.read(1)b5 f.seek(-3,2) #从右向左移动3个字节13 f.read(1)bd VIII。文件备份案例1。案例需求需求:用户输入当前目录下任意文件名,完成文件的备份功能(备份文件名为xx[ backup]后缀,例如:test[ backup ])。txt)。
实施思路:
接收用户输入的文件名
规划备份文件名
备份文件写入数据。
2.代码实现# 1。接收用户输入的文件名(要备份的文件名),oldname=input(请输入要备份的文件名:)# python.txt# 2。计划备份文件名(python[ backup ])。txt)#搜索点编号index=oldname.rfind( . )#返回文件名和文件后缀name=old name[:index]postfix=old name[index:]newname=name [backup] postfix # 3、备份文件old_f=open(oldname, rb)new_f=open(newname,Wb)#读取源文件的内容并写入新文件,同时为true:content=old _ f . Read(1024)iflen(content)==0:break new _ f . write(content)# 4、 关闭文件old_f.close()new_f.close()转载请联系作者取得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。