本文将讲函数与文件。函数在编程中起着非常重要的作用。我们可以将几条语句组合成一个函数,它可以接受传入的参数,并在内部进行相关的计算,产生输出。将语句封装成函数的目的是避免重复使用几个语句使代码冗余,使代码更简洁,更易观察。文件的操作主要介绍了读写文件的一些方法,以及各个方法的区别和注意事项,最后介绍了使用pickle模块存储复杂数据的方式。函数主要包括两个方面:内置函数和自定义函数内置函数就是python自带的一些函数。我们只需要在函数中传入相关参数即可调用它。print是最基本和典型的内置函数。;而自定义函数需要我们根据自己的需要封装若干条语句,形成一个新的函数。自定义函数1.创建一个函数下面通过自定义一个函数来介绍一些属性词来计算长方体的体积:在[1]中:defvol(length,width,height):...:volume=length*width*高度。..:returnvolume在上面三行代码中,你需要了解:?def:定义函数的关键字?length,width,height:函数的形参?return:函数的返回值2.调用函数构建自定义函数之后可以通过函数名(实参)调用函数:In[2]:vol(2,2,3)Out[2]:12传入参数时,它需要注意的是,实际参与的形参必须完全对应,比如位置,数量等,否则会出错。In[4]:vol(2,2)TypeError:vol()missing1requiredpositionalargument:'height'如果要改变传递参数的顺序,需要指定传递哪个形参:In[8]:vol(width=3,length=4,height=5)Out[8]:603.函数默认值函数的参数也可以指定一个默认值。如果我们将上面vol函数中height参数的默认值设为2:在[6]中:defvol(length,width,height=2):...:volume=length*width*height...:returnvolume...:In[7]:vol(2,2)Out[7]:8此时只给vol函数传入两个实参,可以发现没有报错,并且返回值为8。也就是说,如果一个形参有默认值,调用函数时没有给形参传值,那么这个形参就取默认值。4、集合函数(可变函数)对于函数的形式参数,我们也可以将其设置为可变的:In[9]:deftest(*params):...:print('参数的长度为%d'%len(params))...:print('第三个参数是%s'%params[2])...:In[10]:test(1,2,'mao',3.14,'pp')参数的长度为5第三个参数为mao这里需要把形参用*标记,然后在调用参数的时候可以传入几个实参。5.函数中定义的全局和局部常量称为局部变量,即只能在本函数中调用,不接受在函数外使用:在[12]中:deftest(a,b):。..:c=2...:returna*b*cIn[13]:test(2,2)Out[13]:8In[14]:print(c)NameError:name'c'isnotdefined6.Anonymousfunctionlambda如果函数内部的语句不是很复杂,代码量不大,我们可以使用匿名函数,比如上面计算体积的函数:[20]中:vol=lambdaa,b,c:a*b*cIn[21]:vol(2,2,3)Out[21]:12在lambda表达式经常嵌套的语句中,很容易结合相关函数使用,会给出例子之后。7、内置函数在定义一个函数的时候也支持几个函数的嵌套,但是使用的时候需要注意逻辑关系:In[24]:deffun1(a):...:b=2...:deffun2():...:returna*b...:returnfun2()...:In[25]:fun1(4)Out[25]:8常用内建函数内置函数在前两篇文章中都有介绍,不过,比如常用的len、sorted、reversed、sum等,此外还介绍了几个比较基础的内置函数。1.max和min求一个序列中的最大值和最小值:In[28]:min(1,2,3)Out[28]:1In[29]:max(1,2,3)Out[29]:32.abs求一个数的绝对值:In[31]:abs(-1)Out[31]:13.roundround保留小数位数:In[32]:round(3.555,2)Out[32]:3.564.pow计算一个数的幂,或者取余:In[33]:pow(2,3)#2*2*2Out[33]:8In[34]:pow(2,3,3)#(2*2*2)%3Out[34]:25.divmod计算一个数的商和余数:In[36]:divmod(10,3)Out[36]:(3,1)6.help用于查询一个函数的帮助文档:在[37]中:help(abs)Helponbuilt-infunctionabsinmodulebuiltins:abs(x,/)返回参数的绝对值。7.filterfilter()function接收两个参数,第一个参数可以是一个函数或者None,第二个参数是一个序列。作用是判断每个元素,返回True或False,filter()根据判断结果自动过滤掉序列中为False的元素,留下为True的元素,可以和lambda表达式结合使用:In[38]:list(filter(lambdax:x%2,range(10)))Out[38]:[1,3,5,7,9]8.mapmap()函数接收两个参数,一个是函数,另一个是序列。函数是对序列中的每个元素应用函数,也可以结合lambda表达式使用:In[42]:list(map(lambdax:x*2,range(10)))Out[42]:[0,2,4,6,8,10,12,14,16,18]File关于文件的读写操作,肯定会遇到open()函数。如果该文件已经存在,它将打开该文件。如果不存在,则会创建一个文件,通常的用法需要两个参数:open(filename,mode)。第一个参数是文件名,第二个参数指定文件将如何使用。通常使用以下可选模式:?'r':以只读方式打开文件(默认)?'w':以写入模式打开文件,这将覆盖现有文件?'a':打开文件写模式,如果文件存在,追加到末尾?'b':以二进制方式打开文件,然后会有rb、wb等模式的组合1.read()方法读取read()方法可以传入一个参数size,就是读取内容的长度。size为可选??参数,如果不传入或传入负数,则读取文件的全部内容:In[52]:fb=open('E:/PythonFoundation/test.txt','r')In[53]:fb.read(10)Out[53]:'nai\nniatan'In[54]:fb.read()Out[54]:'g\nnaitangmao'In[55]:fb.read()Out[55]:''需要注意三点:1、原文件中的换行符在读取时用换行符'\n'表示,同样占用一个单位长度。2.已经读取的内容不能重复读取3.如果读取的内容返回空字符串,说明已经到达文件末尾2.readline()方法readline()方法从文件中读取一行文件,并且在这行数据的末尾处会有一个换行符'\n',如果其中一行没有数据,则只返回一个'\n',当为空时返回字符串,表示已到达文件末尾。In[59]:fb1=open('E:/Python-based/test.txt','r')In[60]:fb1.readline()Out[60]:'nai\n'3.readlines()readlines()方法也用于读取所有文件。与read()不同的是前者是按行读取,最后返回一个列表,每行数据作为一个列表元素:In[72]:fb3=open('E:/PythonBasics/test.txt','r')In[73]:fb3.readlines()Out[73]:['nai\n','niatang\n','naitangmao']4.遍历文件对象读取这样读取的内容会看起来更规范:In[81]:foriinfb4:...:print(i,end='')...:nainiatangnaitangmao5.写文件的时候需要注意两点:?如果写入的数据是非字符串内容,需要转成字符串?写法要覆盖或者追加In[85]:fb5=open('E:/PythonFoundation/test1.txt','w')In[89]:list1=[1,2]In[91]:fb5.write(str(list1))Out[91]:6Afterwritingwithwrite,将返回写入字符串的长度。6.不要忘记关闭文件!如果使用open()打开文件,请务必在操作完成后使用close()关闭文件。In[92]:fb5.close()7.with方法如果你觉得自己记性不好,老是忘记使用close()方法关闭文件,那你一定要习惯使用with来处理文件对象,当文件用完时可以使用。然后文件自动关闭。在[93]中:withopen('E:/PythonFoundation/test.txt','r')asfb:...:data=fb.read()在[95]中:fb.closedOut[95]:True8.pickle表示不允许将非字符串写入文件。是否有办法保存字典或数据列表?pickle模块可以实现这种序列化存储和读取:In[96]:importpickleIn[97]:list1=['nai','tang','mao',1,2,3]In[98]:pic_f=open('E:/PythonFoundation/list.pkl','wb')[99]中:pickle.dump(list1,pic_f)[100]中:pic_f.close()dump()方法接收两个参数,第一个是要存储的内容,第二个是存储的文件对象。操作完成后,还需要使用close()关闭文件对象。存储后,可以使用load()方法加载文件中的内容。在[102]中:pic_f=open('E:/PythonFoundation/list.pkl','rb')在[103]中:list2=pickle.load(pic_f)在[104]中:list2Out[104]:['nai','tang','mao',1,2,3][105]中:pic_f.close()在存储或读取时使用pickle对二进制形式的文件对象进行操作,即'wb'和'rb',pickle非常适合存储数据类型复杂,数据量大的数据。
