python函数,,编程方法面向对象


编程方法
面向对象               独门秘籍:类      class面向过程               独门秘籍:过程    def函数式编程             独门秘籍:函数    def

函数定义

1、数学函数:
x是自变量,y是因变量;自变量的函数x的取值范围叫做这个函数的定义域;x的变化会引起y的变动。

2、函数式编程:
函数是把逻辑结构化和过程化的一种编程方式。逻辑是指你写一个购物车作业,先画一个流程图,也就是在画逻辑。
函数式编程就是:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。
3、python中的函数定义方法:

    def test01(x):                             #def是定义函数的关键字;test是函数名;括号内是可定义形参;            "the function definitions"  #""里边是描述            x += 1                                  #泛指代码块或程序处理逻辑            return x                              #定义返回值

4、面向过程和函数式编程的区别之处
定义函数

def test1():    ‘‘‘test1‘‘‘    print("test1")    return 0             #有返回值

定义过程

def test02():    ‘‘‘test02‘‘‘    print("test02")             #没有返回值

函数调用

test1()    #()代表调用test1函数;括号内可以有参数 也可以没有。x=test1()print(x)结果:test10

过程调用

y=test02()print(y)结果:test02None

总结:面向过程和函数式编程的区别:
相同之处:都可以被调用
不通之处:过程没有返回值;函数有返回值。
python中的面向过程,系统会默认返回一个None。

函数的三个特点

为什么使用函数,没有函数的编程只是在写逻辑(功能),想脱离函数,重用逻辑,唯一的办法就是拷贝。
例1:

with open("test01","a") as f:    f.write(‘this is a stop‘)

现在有三个函数,每个函数在处理完自己的逻辑后,都需要使用上面的逻辑,那么唯一的办法就是拷贝三次逻辑;

def test1():    print("this is test1")    with open("test01", "a") as f:        f.write("stop stop")def test02():    print("this is test02")    with open("test01", "a") as f:        f.write("stop stop")def test3():    print("this is test3")    with open("test01", "a") as f:        f.write("stop stop")执行:test1()test02()test3()

例2:优化后的,重复利用逻辑

def logger():    with open("test01","a") as f:        f.write(‘this is a stop\n‘)def test1():    print("this is test1")    logger()def test02():    print("this is test02")    logger()def test3():    print("this is test3")    logger()执行:test1()test02()test3()

例:3:打印的时候加上时间,可扩展

import timetime_format = "%Y-%m-%d %X"time_now = time.strftime(time_format)def logger():    with open("test01","a") as f:        f.write(‘\n%s this is a stop\n‘%time_now)def test1():    print("this is test1")    logger()def test02():    print("this is test02")    logger()def test3():    print("this is test3")    logger()执行:test1()test02()test3()

总结 函数的三个优点
1.代码重用
2.保持一致性
3.可扩展性

函数返回值

def abc1():        print("aaaaaaa:")        return 0                  #return 结束逻辑;后边的代码不执行;        print("bbbbbbb:")def abc2():        print("aaaaaaa:")def abc3():        print("aaaaaaa:")        return 1,"hello",["a","b","c"],{"aaa":111}x = abc1()                   #x接收的是abc函数的返回值0;y = abc2()z = abc3()print(x)                     #return 结束逻辑;后边的代码不执行;print(y)print(z)‘‘‘输出:aaaaaaa:aaaaaaa:aaaaaaa:0None(1, ‘hello‘, [‘a‘, ‘b‘, ‘c‘], {‘aaa‘: 111})‘‘‘

函数返回值总结
1.没有return返回值:返回None
2.return返回一个值:返回object (object就是你定义的返回值;python中的所有数据类型都是对象)
3.return返回多个值:返回tuple (元组形式返回)
为什么要有返回值?
因为想知道这个函数的执行结果是否成功,然后再进行下一步操作。

函数参数

1、形参和实参
形参定义:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时候接收实参;
实参定义:实际参数,调用函数时传给函数的参数,可以是常量、变量、表达式、函数、传给形参;
2、位置参数和关键字参数
位置参数和形参要一一对应;
位置参数和关键数同时存在的时候,关键参数不能写在位置参数前面;

def test01(x,y):          #x和y是形参    print(x)    print(y)test01(1,2)              #1和2是实参;位置参数和形参要一一对应;test01(x=1,y=2)      #关键参数与形参顺序无关;                               #位置参数和关键数同时存在的时候,关键参数不能写在位置参数前面;

3、默认参数
特点:调用函数的时候,默认参数可有可无;
用途:默认安装值(例如安装软件的时候,设置默认安装路径;默认数据库端口值)

def moren(x,y=6):       #y=6 是默认参数    print(x)    print(y)moren(5)输出:56

4、参数组
当实参不固定的时候,形参如何定义;
参数组1: 多个实参对应形参

def canshuzu(*args):        # *代表接收的参数是不固定的;*args把实参变成了一个元组;    print(args)canshuzu(1,2,3,4,5)‘‘‘输出:(1, 2, 3, 4, 5)‘‘‘

参数组2:形参和参数组结合

def canshuzu2(x,*args):    print(x)    print(args)canshuzu2(1,2,3,4,5)‘‘‘输出:1(2, 3, 4, 5)‘‘‘

参数组3:把关键字参数转换成字典格式输出
#*args:接收n个位置参数,转换成元组的形成
#**kwargs: 把n个关键字参数转换成字典方式

def canshuzu4(**kwargs):    print(kwargs)    print(kwargs[‘name‘])canshuzu4(name="aaa",age=111)输出:{‘name‘: ‘aaa‘, ‘age‘: 111}aaacanshuzu4(**{"name":"aaa","age":222})输出:{‘name‘: ‘aaa‘, ‘age‘: 222}aaadef canshuzu5(name,age=12,*args,**kwargs):    print(name)    print(age)    print(*args)    print(kwargs)canshuzu5("aaa",age=22,job="it",)输出:aaa22               #空的元组{‘job‘: ‘it‘}

函数局部变量和全局变量

namename = "AABBCC"                 #全局变量def jubu(name):    namename = "aabbcc"               #局部变量    print("before change",name,namename)    name = "ABC"                    #这里的name是局部变量,这个函数就是这个变量的作用域;    print("after change",name)name = "abc"                        #全局变量jubu(name)                           #执行函数后的结果print(name)                          #此处没有执行函数,直接调用变量print(namename)                      #此处没有执行函数,直接调用变量‘‘‘输出:before change abc aabbccafter change ABCabcAABBCC‘‘‘

总结

局部变量:在子程序中(函数)定义的变量称为局部变量。                    局部变量作用域是该变量的子程序;全局变量:在程序的一开始定义的变量称为全局变量。                    全局变量作用域是整个程序;当全局变量和局部变量同名时:        当定义局部变量的子程序内,局部变量起作用;其他地方全局变量起作用。        字符串和整数 在局部变量情况下是不能修改全局变量的值;要想改变在局部变量前加global;        除了字符串和整数、元组以外高级点的类型(列表、字典、集合、类),局部变量可以改变全局变量的值;
 例子:设置局部变量修改全局变量namename = "AABBCC"def jubu(name):    global namename                 #设置局部变量修改全局变量    namename = "aabbcc"    print("before change",name,namename)    name = "ABC"                    #这里的name是局部变量,这个函数就是这个变量的作用域;    print("after change",name)name = "abc"jubu(name)print(name)print(namename)输出:before change abc aabbccafter change ABCabcaabbcc

函数-递归

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

递归特性
1.必须有一个明确的结束条件;
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)
4.最大的递归层次是999层,超过 就报错;
简单的递归例子

def digui(n):    print(n)    return digui(n)dict(0)                 #0是为了查看递归的次数,递归的次数最大为997次;然后就报错了

简单的递归例子2

def digui2(n):    print(n)    if int(n/2) >0:        return digui2(int(n/2))    print(n)digui2(10)输出:105211

高阶函数

定义
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这就叫做高阶函数。

例如:def add(x,y,z):    return z(x) + z(y)result = add(3.3,-6,abs)     #abs()      查看绝对值,是一个内置函数。print(result)输出:9.3

扩展:

装饰器:http://blog.51cto.com/506554897/1963710
生成器:http://blog.51cto.com/506554897/1963775
迭代器:http://blog.51cto.com/506554897/1963780

python函数

评论关闭