局部变量只在函数中有用,出了函数就用不了,形参是局部变量,所以每个函数定义相同也没有影响。
全局变量在函数外边定义的变量叫全局变量。如果在函数中直接修改全局变量,会报错,要修改,则加声明
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---')