python学习之路day5

时间:2022-12-31 12:53:09

python学习之路day5

即:s_gbk.decode("gbk").encode("utf-8")    

#标明自己(s_gbk)是什么编码(gbk),要解码(decode)or编码(encode)


import sys

print(sys.getdefaultencoding())      #显示 utf-8 文件编码为 utf-8
s="你好"                    #但是s是unicode编码
                   #因此s.decode()是不存在的

 


 

函数与函数式编程

1.面向对象  >>类   class

2.面向过程  >>过程  def

3.函数式编程  >>函数  def


过程.VS.函数

过程和函数都可以调用,过程就是没有返回值的函数

但是在python中,过程也被当成函数,返回值为None,函数也可以没有返回值


python学习之路day5

return的个数,类型都不限定!

但是---------实际上python返回的是一个元组,里面包含了上面这些(选中的)数据

 


 

实参与形参 

def test(x,y)括号里的参数是形式参数,接收实际参数的值,def之外的test(y,x)是实际参数

def test(x,y,z):
  print(x)
  print(y)
  print(z)
test(2,z=1,y=4)    #注意z,y的顺序

结果依次是:2, 4, 1

def test(x,y=1,z=2):    #默认参数y=1,z=2,即实参只有一个时,y,z也有默认的值(1,2)

形参数量应该等于实参,实参可能少(有默认参数)即:实参<=形参

当实参数量不固定时,形参的形式应该为:

def test(*args)    #args为变量名  注意*号

这样args可以接收多个实参,并放在一个元组里(--,--,--,--)

 


 

 python学习之路day5

这样*args就接受了(2,3,4,5,6,7),x接收了1

*args接收N个位置参数,转换成元组的方式


 

 **kwargs:接收N个关键字参数,转换成字典的方式

def test2(**kwargs):

  print(kwargs)

test2(name='alex',age=8,sex='F')    #关键字参数指:xxx=yyy的形式

像上面的*args和**kwargs这样的参数组,必须放在位置参数的后面!

 


 

局部变量和全句变量

def 里面的变量就是局部变量,只在def里面作用

全局变量是在整个程序中生效的变量,尽管在def中全局变量可以被修改,但出了def全局变量就还是原来定义的值。

当全局变量与局部变量同名时: 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

但是------------------如果def里面申明了全局变量,则真正修改了全局变量

格式:global 全局变量

全局变量一定要在def外面显示的定义而不是在函数里定义

但绝对不要使用这种方法(在函数里面定义全句变量),一旦出错导致程序的调试极其麻烦!


 

虽然上面说了函数里面不能改全局变量,但是这仅仅针对字符串和整数;像列表,字典,集合,类等都可以在局部里改全局的(在def函数里改全句变量的值)(元组本来就不能改)


 

递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

 

最多递归999次


高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x,y,f):

    return f(x) + f(y) res = add(3,-6,abs) print(res)

这个例子abs是内置的函数,取绝对值。f接收abs函数,最后返回9