局部变量只在函数中有用,出了函数就用不了,形参是局部变量,所以每个函数定义相同也没有影响。
全局变量在函数外边定义的变量叫全局变量。如果在函数中直接修改全局变量,会报错,要修改,则加声明
global num ,则可以修改,再在后面用到num,则成为改变后的值。全局变量是不可变类型,必须加global;是可变类型,则可加不可加都可以。
函数名不能重复,可以是无参无返回值;无参有返回值;有参无返回值;有参有返回值。
返回值:遇到一个return 即函数停止。多个值返回得用一个列表或元组装起来,每一个取位置的元素。即result[0],result[1]...;也可以用字典,key键,newinfo['name']=result['name'],写成字典比较好,适合前后端交互,不用看元素位置。确定返回个数的多个值可以用return c,d。此时,默认是元组形式。调用时,a,b=func()。
参数:缺省参数(默认参数)必须放在最后,如果想跳着默认参数更改,则指定参数名称。指定名称,则顺序可以变,不写名称,则会按位置传。不定长参数def test(a,b,*args,**kargs),除了a,b,其他没有指定名字的参数都以元组形式传给args(它也可以换名字),指定名字的参数都以字典形式传给kargs,名字则为键(它也可以换名字),参数不仅可以是值,还可以是列表,字典等,和上述规则一样。但是存在下面情况,在调用时,test(a,b,*A,**B)称作解包,即[1,2,3]=(1,2,3);{d:{'a':1}}={'a':1}(不是特别的理解)
可变不可变类型:
可变:列表,字典,因此字典中的键不能是这两种;不可变:数字,字符串,元组,可以是字典中的键。即变的是内存号。
函数传递运用时,当遇上传入的是可变类型时,则a=a+a会更改a的内存号;而a+=a不会更改a的内存号;注意两种写法的区别。
递归函数:在函数里调自己。注意要有结束的条件,否则占内存。先进后出,栈。求n的阶乘。
def tedt(num):
if num>1:
result=num*test(num-1)
else:
result=1
retrun result
lambda函数的而应用:可用作加减运算,也可以当做参数,给结果起变量,还可以用在sort函数里。
sum=lambda x,y:x+y;sum(10,20)
def test(a,b,sum):
return sum(a,b)
调用 test(a,b,lambda x,y:x+y)
b.sort(key=lambda x:x['xuhao'])#按序号排序
文件操作
'r'是文件不存在就会报错,读默认方式,从一行读,f.read()一次性全读进内存,读到一个元素里,再读啥也没有,风险较大,可考虑f.read(1000);可用str.splitlines()一行是一个元素,另外两种。f.readlines()和前面split差不多;f.readline()只读一行,再读从下一行开始读还有'w','a',这两种是没有文件,会新创建,'w'是有文件,则会覆盖原文件内容。小心。'a'是从最后面开始追加。b是二进制文件,加号是可读可写模式。复制文件内容例子,三个方法。
f_read=open('text.txt','r')
f_write=open('text.txt','w')
content=f_read.read()
f_write.write(content)
for linecontent in f_read.readlines():
f_write.write(linecontent)
while True:
linecontent=f_read.readline()
if len(linecontent)>0:
f_write.write(linecontent)
else:
break
f_read.close();f_write.close()
类是一个模型,创建对象的模板。创建xaiomao=Cat()里面可以传不同的参数,可以放在初始化函数#两个下划线加上名字再加两个下划线。__init__(),__str__()魔法方法,这个后面必须跟return XXX即创建类之后,就自动执行这两个方法,叫做魔法函数#中,以指代不同的类,其他不变,则节省空间。不跟小括号叫属性,跟小括号叫方法。下面是一个完整的例子。
类包括三个:类名,属性,方法
class Cat:#不加小括号
def __init__(self,newcolor,newweight,newWeiBa):#创建类对象后,自动执行
self.color=newcolor#添加属性,则后面创建类时要传参。
self.weight=newweight
self.weiba=newWeiBa
#self.color=‘红色’#写死,即不用传参
#self.weight=5
#self.weiba=‘有’
def eat(self):#定义方法
print('吃')
def __str__(self,a,b):#创建类对象后,自动执行
print('---a=%d,b=%d---'%(a,b))
def sleep(self):#定义方法
return '当前的颜色为:' +self.color
#创建类对象
xaiohongmao=Cat('红色',5,‘有’)
xaiolvmao=Cat('绿色',5,‘有’) #可创建不同的对象。
#调用方法,加小括号。
xaiohongmao.eat()
xaiohongmao.sleep()
#当前面没用添加类属性时,即没有写在初始化方法里,则创建好类后,可以添加类属性,后面不跟着小括号,跟着创建好之后写。
xiaohongmao.color='红色'
a=xiaohongmao.color#不用加括号
#调用属性,两种方法。第一种,赋值,a=xiaohongmao.color,打印;第二种,定义一个方法,使用str.属性,就像初始化方法一样
,但不同的时可以放在自定义的函数里。
最后print(类名),返回地址,魔法函数还有(id(类名))
私有属性和方法,就是在名字前加上两个下划线,即起保护作用,即在后面就调用不了属性和方法,在看类的时候,可以先区分出来,哪些不可以修改,哪些可以修改。如何修改,对于属性来说,一般构造两个函数,即
def setnewage(self,newage):#设置属性
if newage>0 and newage<100:
self.__age=newage
def getage(self):#得到属性
return self.__age#/函数有返回值在后面调用的时候,赋值给一个变量,再print出来。
对于方法来说,一般写在接口里,即
def __test(self):
print('---test---')#如何访问?
def test2(self):
self.__test()#调用test2方法,此时可以访问了
print('---test2---')
def __del__(self):
print('---del---')