python编程的3种模式
1:面向对象:对函数进行分类和封装,定义用class。
2:面向过程:定义用def,简单讲(根据业务逻辑从上到下垒代码)。特性:代码重用,一致性,可扩展
3:函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可,定义用def。python不完全支持函数式编程。
存函数式编程语言为:lisp,hashshell,erlang
数据类型分为:
1:不可变类型:数字,字符串,元组。
2:可变类型:列表,字典,集合等
函数定义:逻辑结构化和过程化的一种编程方法
定义方法:
def test(x):
"注释"
x += 1
return x
函数返回值总结:
1:返回值数量=0,返回NONE
2:返回值数量=1,返回object
3:返回值数量>1,返回tuple(元组)
函数的参数分为:形式参数,实际参数。
形参:定义函数时指定的参数。
举例:
def fun(x,y) 其中的x,y叫做形参
实参:调用函数时为函数实际赋与的值叫实参。
举例: def fun(x,y): .....
fun(1,y=2) 这里调用函数赋予真实的值叫实参
函数形参的种类有:4种
1:位置参数,按照形参对应实参的位置,为实参一一赋值。 如:def fun1(x,y); fun1(1,2)
2:关键字参数:函数赋值时指定形参参数。如:def fun1(x,y); fun1(x=1,y=2)
提示:当位置参数和关键字参数同时存在,位置参数必须在关键字参数的前面,并且参数要与形参对应。
3:默认参数:调用函数的时候,默认参数非必须传值,赋值有2种方式(位置参数赋值和关键字赋值)
默认参数的用途:一般为程序定义默认值,
4:参数组(可变长):分2种参数。
1:*args:将多个位置参数转为元组
2:**kwargs:将多个关键字参数转为字典
举例:*args:接收多个位置参数,转换为元祖
def fun(*args): print(args)
调用以上函数赋值方式:
1:fun(1,2,3,4,5) 传入多个位置参数
2:fun(*[1,2,3,4,5] 以*号标识传入一个列表
同时带有位置参数和可变参数写法:
def fun(x,*args):
print(x)
print(args)
fun(1,2,3,4) 打印结果为:x结果是1,args结果是2,3,4
举例:**kwargs:接收多个关键字参数,转换为字典
def fun(**kvargs):
print(kvargs)
print(kvargs['k1'])
赋值方式:
1:fun(k1='v1',k2='v2',k3='v3')这里以关键字参数赋值
2:fun(**{'k1'='v1','k2'='v2','k3'='v3'})
混合写法举例
def test4(name,age=18,*args,**kvargs):
print(name)
print(age)
print(args)
print(kvargs)
赋值
test4('jeck',20或者age=20,*[1,2,3],k1='v1',k2='v2')
打印结果为:
jeck
20
[1,2,3]
{'k1':'v1','k2':'v2'}
变量:局部变量,全局变量
1:局部变量:在子程序(也叫函数)中定义的变量,它的作用域就是这个函数(子程序)。
举例:def fun():
name = 'jeck' 这个就是函数中定义的局部变量,只能在函数中使用,函数结束后此变量也就失效。
注:可以通过在此变量的上方写入:global name 将此变量声明为全局变量。(一般不要使用此方法)
2:全局变量:在程序一开始定义的变量,也就是顶格写的变量。作用域就是整个程序。
另:当全局变量和局部变量同名时:在函数内局部变量起作用,其他地方全局变量起作用。
局部变量影响全局变量的使用情况:
1:当全局变量类型是:字符串,数字,元组,(都为不可变类型)时,局部变量无法修改全局变量。
2:当全局变量类型是:列表,字典,集合等可变类型时,局部变量可以修改全局变量。
函数 -- 递归:就是函数不断的对自身进行调用,最大递归次数:999次
特性:
1:必须要有一个明确的结束条件
2:每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3:效率不高,层数过多会导致栈溢出
简单举例:
def fun(n): print(n) if n//2 > 0: return fun(n//2) print('---->',n) fun(10)