临近毕业,没有一丝兴奋,没有一点失落,剩下的只有一份释怀、一颗怀揣着’永不卑微,永不残忍,永不虚伪‘的赤子之心。我的大学前半部分是精彩夺目的、争名逐利,后半部分是孤独的、高山望远,也印证了那句话:你只有独处时,才知道自己真正想要什么、能干什么。庆幸自己真正的跳出圈子找到了一个可以为之奋斗,为之抛弃所有(除亲情)的目标,我必将践行之,并永远走下去...没有加油,只有拼命二字!
由于这几天回去拿毕业证书,补6.4、6.5号笔记,文件基本操作、绝对路径和相对路径、文件的打开模式、文件可读可写、控制文件指针移动、文件修改、函数的基本使用、函数的定义阶段和调用阶段、函数定义的三种形式
暂时没时间,先把今天的提交,网大姨妈。
什么是文件?
文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,
文件的操作核心就是:读、写
即我们只要进行读写操作,就是对操作系统发出请求,然后由操作系统将用户或者应用程序对文件的读写操作转换成具体的硬盘指令(比如控制盘片转动,控制机械手臂移动起来读写数据)
2.为什么要有文件?
因为内存无法永久保存数据,但凡我们想要永久保存数据都需要保存到硬盘中,而操作文件就可以实现对硬件的操作
3.如何用文件?
1.函数的返回值
返回值是一个函数的处理结果
2.为什么要有返回值
如果我们需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须由返回值
3.函数的返回值的应用
函数的返回值用return定义
格式为:
return 值
注意:
1.return是一个函数结束的标志,函数内可以由多个return,但只要执行一次,整个函数就会结束运行
2.return的返回值无类型限制,即可以是任意数据类型
3.return的返回值无数字限制,即可以用逗号分隔开多个任意类型的值
0个:返回None,ps:不写return默认会在函数的最后一行添加return None
1个:返回的值就是该值本身
多个:返回值是一个元组
def max2(x,y): #x=3000,y=2000 if x > y: return x #return 3000 else: return y #reuturn 2000 res=max2(3000,2000) annual_salary=res * 12 print(annual_salary) def foo(): print(1) print(2) print(3) return [1,2,3],'a',('a','b'),{1,2} print(4) print(5) print(6) res=foo() print(res) def bar(): print(1) print(1) print(1) print(1) return print(2) print(3) print(4) res=bar() print(res)
2.调用函数
1.什么是调用函数
函数名(...)即调用函数,会执行函数体代码,知道碰到return结束或者一直运行完毕所有代码
2.为何要调用函数
用函数的功能
3.函数调用分为三种形式
def max2(x,y): if x > y: return x else: return y #形式一: max2(1,2) #形式二: res=max2(3000,2000) * 12 print(res) #形式三: res=max2(max2(1000,2000),3000) print(res)
3.函数的参数
1.形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称为形参,本质就是变量名
def foo(x,y): #x=1,y=2 print(x) print(y)2.实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值
foo(1,2)
详细分类:
1.位置形参:在函数定义阶段,按照从左到右的顺序一次定义的形参,称之为位置形参
特点:但凡是按照位置定义的形参,都必须被传值,多一个不行,少一个不行
def foo(x,y): print('x:',x) print('y:',y)
位置实参:在函数调用阶段,按照从左到右的顺序一次定义的实参,称之为位置实参
特点:按照位置为对应的形参依次传递
foo(1,2) foo(2,1)
关键字实参:在调用函数时,按照key=value的形式为指定的参数传真,称为关键字实参
特点:可以打破位置的限制,但仍能为指定的形参赋值
foo(y=2,x=1)
注意:可以混用位置实参与关键字实参,但位置实参必须放在关键字实参的前面
foo(1,y=2) foo(y=2,1) #SyntaxError: positional argument follows keyword argument # 语法报错
可以混用,但不能对一个形参重复赋值
foo(1,y=2,x=10)
默认形参:在函数定义阶段,就已经为形参赋值,该形参称为默认形参
特点:在定义阶段就已经被赋值,意味着在调用可以不用为其赋值
def foo(x,y=10): print('x:',x) print('y:',y) foo(1) foo(1,3)
注意:位置形参必须放到默认形参的前面,否则会语法报错
def foo(x=1,y): pass
默认形参的值只在定义阶段赋值一次,即默认参数的值在函数定义阶段就已经固定死了
m=10 def foo(x=m,y=11): print(x) print(y) m=1111111111111111111111111111111111111111111111111111111111 foo()
默认形参的值通常应该定义不可变类型
def register(name,hobby,hobbies=[]): hobbies.append(hobby) print('%s的爱好' %name,end=':') print(hobbies) register('egon','play') register('alex','piao') register('lxx','烫头') # 输出时lxx有三个爱好 def register(name,hobby,hobbies=None): if hobbies is None: hobbies=[] hobbies.append(hobby) print('%s的爱好' %name,end=':') print(hobbies) register('egon','play') register('alex','piao') register('lxx','烫头') # 输出时lxx只有一个爱好
总结:
形参的使用,取决于个人习惯
形参的应用:
1.位置形参:大多数情况下的调用值都不一样,就应该将该参数定义成位置形参
2.默认形参:大多数情况下的调用值都一样,就应该将该参数定义成默认形参
def register(name,age,sex='male'): print(name) print(age) print(sex) register('egon',18,) register('大脑门',73,'female') register('小脑门',84,) register('大高个',18,)
可变长参数:指的是在调用函数时,传入的参数个数可以不固定
而调用函数时,传值的方式无非两种,一种位置实参,另一种是关键字实参
所以对应着,形参也必须有两种解决方案,来分别接收溢出的位置实参(*)与关键字实参(**)
1.形参中的某个参数带*
形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给*后的变量名
def foo(x,y,*z): #x=1,y=2,z=(3,4,5,6,7) print(x) print(y) print(z) foo(1,2,3,4,5,6,7)
应用:
def my_sum(*nums): res=0 for num in nums: res+=num return res print(my_sum(1,2,3,4,5))
2.实参中的参数也可以带*
实参中带*,*会将该参数的值循环取出,打散成位置实参
ps:以后但凡碰到实参中带*的,它就是位置实参,应该立马打散成位置实参去看
def foo(x,y,z): print(x,y,z) foo(1,*[2,3]) #foo(1,2,3) foo(1,*'he') #foo(1,'h','e') foo(1,*(2,3,4)) #foo(1,2,3,4) def foo(x,y,z,*args): print(x) print(y) print(z) print(args) foo(1,2,3,4,5,6,7,*[8,9,10,11]) #foo(1,2,3,4,5,6,7,8,9,10,11)
注意:约定俗成形参中的*变量名的写法都是:*args
1.形参中的某个参数带**
形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的变量名
def foo(x,y,**z): #x=1,y=2,z={'c':5,'b':4,'a':3} print(x) print(y) print(z) foo(1,2,a=3,b=4,c=5)
2.实参中的参数也可以带**,该参数必须是字典
实参中带**,**会将该参数的值循环取出,打散成关键字实参
ps:以后但凡碰到实参中带**的,它就是关键字实参,应该立马打散成关键字实参去看
def foo(x,y,z): print(x) print(y) print(z) foo(1,2,**{'a':1,'b':2,'c':3,'z':3}) #foo(1,2,c=3,b=2,a=1,z=3) foo(**{'z':3,'x':1,'y':2}) #foo(y=2,x=1,z=3)
注意:约定俗成形参中的**变量名的写法都是:**kwargs
ef index(name,age,sex): print('welecome %s:%s:%s to index page' %(name,age,sex)) def wrapper(*args,**kwargs): #args=(1,),kwargs={'x': 1, 'y': 2, 'z': 3} index(*args,**kwargs) #index(*(1,),**{'x': 1, 'y': 2, 'z': 3}) #index(1,x=1,y=2,z=3) wrapper(name='egon',sex='male',age=18)
命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数(**不太重要)
特点:在传值时,必须按照key=value的传,并且key必须命名关键字参数指定的参数名
def register(x,y,z,**kwargs): #kwargs={'b':18,'a':'egon'} if 'name' not in kwargs or 'age' not in kwargs: print('用户名与年龄必须使用关键字的形式传值') return print(kwargs['name']) print(kwargs['age']) register(1,2,3,a='egon',b=18) def register(x,y,z,*args,name='egon',age): print(args) print(name) print(age) register(1,2,3,4,5,6,7,age=18)