即: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,函数也可以没有返回值
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可以接收多个实参,并放在一个元组里(--,--,--,--)
这样*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