06、python 系列之--函数

06、python 系列之--函数_第1张图片
fun.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

PS:转载请注明出处
作者: TigerChain
地址: http://www.jianshu.com/p/105ee1470d02
本文出自 TigerChain Python 系列

教程简介

  • 1、阅读对象

本篇教程适合新手阅读,老手直接略过

  • 2、教程难度

    初级

  • 3、demo 地址:https://github.com/tigerchain/python-study/tree/master/01-basic/03、函数 如果喜欢就给个 star 吧

正文

一、什么是函数

1、定义

在编程中,函数是对实现特定功能,并且可以重复使用的一个代码片段。比如 python 的内置函数 print(),函数的作用:

  • 1、封装代码
  • 2、降低耦合
  • 3、方便复用
  • 4、方便阅读

2、定义函数的格式

def 函数名(参数...):
    函数体
    ...

ps:函数体以 : 号开始,并且缩进

比如定义一个 返回 a+b 的函数

def add(a,b):
    return a+b

这样就自定义了一个函数。

函数调用:add(5,6) 即可

demo1:将后一个姓名列表添加到第一个列表的末尾


names = ["tigerchain","xiaoming","liubing"]

print("原始的姓名列表是:%s"%names)

# �定义函数 
def appendList(lists):
    names.append(lists)
    print("添加后的姓名列表是:%s"%names)

new_names = ["sulei","xiaozhang"]
appendList(new_names)

print("最终的姓名列表是: %s "%names)

运行查看结果:

▶ python 01、函数的基本用法.py
原始的姓名列表是:['tigerchain', 'xiaoming', 'liubing']
添加后的姓名列表是:['tigerchain', 'xiaoming', 'liubing', ['sulei', 'xiaozhang']]
最终的姓名列表是: ['tigerchain', 'xiaoming', 'liubing', ['sulei', 'xiaozhang']]

二、函数的参数

1、形参和实参

首先我们要明确一点 python 中传递参数是按址传递的,也就是把变量的引用传递进去,而不是按值传递

  • 1、定义函数后面的()中的参数称为形参
  • 2、调用函数的方法,传递给函数的参数称为实参

比如:定义一个函数

def addsub(a,b):
    return a+b

其中 a 和 b 是形参

调用方法 addsub(1,5),其中 1,5 就是实参

2、理论上函数可以传递无数个参数,但是不建议这样干,如果多个参数,就想办法抽取多个方法

def 方法名(形参1,形参2,...,形参n)

demo2:定义一个函数,输入三条边,看其能不能组成三角形

def sanjiao(x,y,z):#实际开发中不要使用拼音作为函数名
    if(x+y>z and x+z>y and y+z>x):
        print("%d,%d,%d 可以组成三角形"%(x,y,z))
        if(x==y==z):
            print("并且这是一个等边三角形")
        elif(x==y or y==z or x==z):
            print("并且这是一个等腰三角形")
        elif(x*x+y*y==z*z or y*y+z*z==x*x or x*x+z*z==y*y):
            print("并且这是一个直角三角形")
        else:
            print("并且这是一个普通的其解形")
    else:
        print("不好意思,你三角形的概念好好学学吧,不能构成三角形")

print("请输入三角形的三条边")

x = raw_input("第一条边:")
y = raw_input("第二条边:")
z = raw_input("第三条边:")

sanjiao(int(x),int(y),int(z))

运行查看结果:

06、python 系列之--函数_第2张图片
fun_sanjiao.gif

demo3:输入三个数,输出最大数

def getMax(x,y,z):
    max = x
    if(y>max):
        max=y
        if(z>max):
            max=z

    return max

a = raw_input("请输入第一个数:")
b = raw_input("请输入第二个数:")
c = raw_input("请输入第三个数:")

print("%d,%d,%d 中最大的数是:%d"%(int(a),int(b),int(c),getMax(int(a),int(b),int(c))))

运行查看结果:

▶ python 02、形参和实参.py
请输入第一个数:4
请输入第二个数:8
请输入第三个数:0
4,8,0 中最大的数是:8

3、变量的作用域

定义在函数体中的变量只能在本函数中有效,出了函数以后就不能被访问

demo1:变量的作用域

def add(x,y):
    z = x+y
    print z
def new_add():
    print("===1====")
    z+=4
    print("===3===")
    print z

add(1,2)
new_add()

运行查看结果:

▶ python 04、变量作用域.py
3
===1====
Traceback (most recent call last):
  File "04、变量作用域.py", line 13, in 
    new_add()
  File "04、变量作用域.py", line 8, in new_add
    z+=4
UnboundLocalError: local variable 'z' referenced before assignment

挂掉了,问题出在 new_add() 方法中的 z+=4,看 error 大概意思就是不能访问之前在 add 方法中定义的 z 变量

三、函数的文档「注释」

我们知道多行注释使用 ''' ''' ,函数的文档是什么呢?就是用来描述函数的语句,但是不会被编译,不能使用 # 注释

demo1:对 add 函数作文档说明

'''
    demo1:对add 函数作文档说明
'''
def addFun(a,b):
    ''' 这个函数是返回两个整数的和 '''
    return a+b
'''help(addFun) 显示方法体中的文档说明'''
print __doc__

运行查看结果:

▶ python 03、函数的文档.py


    demo1:对add 函数作文档说明

2、局部变量和全局变量

1、局部变量:局部变量是针对方法而说的,没有方法局部变量就没有意义,定义在方法体中的变量我们称为局部变量,局部变量只能在方法体中被仿问,在方法体外是不能被仿问的。

2、全局变量:定义在方法调用之前的变量,我们称为全局变量,全局变量,所有方法都要以仿问

demo2:以下 demo1 中的 x 是修改全局变量 x 还是定义了一个局部变量 x 呢?

x = 0
def demo1():
    x = 100
    print("x 的值是%d "%x)
def demo2():
    print("x 的值是%d "%x)
    pass

demo1()
demo2()

运行查看结果:

▶ python 04、变量作用域.py
x 的值是100
x 的值是0

可以看到在 demo1 方法中的变量 x 就是定义一个局部变量,对全局变量 x 一点毛影响也没有。那么,我们如何让 demo1 中的 x 就是修改全局变量 x 呢?,使用 global 关建字来声明即可

稍微修改上面的代码在 demo1 x = 100 之前加入 global x

global x
x = 100

继续运行查看结果:

▶ python 04、变量作用域.py
x 的值是100
x 的值是100

可以看到我们成功的修改了全局变量。

demo3:可变类型变量例子

# 定义一个列表「可变类型」
a = [1,2,3,4]

def demo1():
    a.append(5)
    print("a 的内容是 %s"%a)
def demo2():
    print("a 的内容是 %s"%a)
    pass
demo1()
demo2()

运行查看结果:

▶ python 04、变量作用域.py
a 的内容是 [1, 2, 3, 4, 5]
a 的内容是 [1, 2, 3, 4, 5]

我们可以看到,执行 demo1() 我们就修改了列表,所以如果声明的是列表类型的变量,我们就可以直接修改

四、函数的参数(二)

1、缺省参数

缺省参数,就是我们可以给函数默认设置参数,格式如下:

def 方法名(参数1,参数2,...,参数n = 值)

PS:在这里一定要注意一点,缺省参数一定要放在参数列表的最后面

demo1:定义函数 demo1(),并且带有两个参数姓名和年龄,并且姓名是默认值是'TigerChain',输入看结果

# -*- coding:utf-8 -*-

'''
    demo1:缺省参数 
'''

def demo1(age,name='TigerChain'):
    print("name = %s"%name)
    print("age = %d"%age)
demo1(12)

运行查看结果:

▶ python 05、函数的参数.py
name = TigerChain
age = 12

从上面的 demo 中我们可以看到,如果我们没有给默认值的参数传值的话,就会使用默认值,如果我们传递了呢?答案肯定是按传递的值显示,修改上面代码,只是把调用方法改为 demo(12,'TigerChain001')

查看结果

▶ python 05、函数的参数.py
name = TigerChain001
age = 12

2、不定长参数

我们知道函数的参数理论上可以有无数个,如果一个函数要处理比声明时更多的参数,这就叫做不定长参数,在传递的时候才会确定参数的多少,格式如下:

def 方法名(参数1,参数2,*参数3,**参数4):
    方法体

PS:其中参数 1 和参数 2 没有什么说的,就是普通的参数,参数 3 传递进来的会被录作元组存起来,参数 4 「两个 **」传递的是字典

demo2:可变参数 1

def demo2(param1,param2,*param3):
    print "param1 = ",param1
    print "param2 = ",param2
    print "param3 = ",param3
demo2(1,2,3,4,5,6)

运行查看结果:

▶ python 05、函数的参数.py
param1 =  1
param2 =  2
param3 =  (3, 4, 5, 6)

我们可以看到 3,4,5,6 被当作元组传传递过来

  • 我们修改上面的代码
def demo3(param1,param2,*param3,**param4):
    print "param1 = ",param1
    print "param2 = ",param2
    print "param3 = ",param3
    for key,value in param4.items():
        print key ," = ",value

demo3(1,2,3,4,5,name='TigerChain',age=12,address='中国')

运行查看结果:

▶ python 05、函数的参数.py
param1 =  1
param2 =  2
param3 =  (3, 4, 5)
age  =  12
name  =  TigerChain
address  =  中国
  • 续续修改上面的代码,我们把调用方式改一下
c = (7,8,9)
d = {"name":"TigerChain","age":12,"sex":"男"}
demo3(1,2,3,c,d)

运行查看结果:

▶ python 05、函数的参数.py
param1 =  1
param2 =  2
param3 =  (3, (7, 8, 9), {'age': 12, 'name': 'TigerChain', 'sex': '男'})

我们可以看到 c 「元组」 和 d 「字典」 整体被当做元组传到 param3 中了

  • 再修改上面的代码

这次我们在上面代码基础上,只是修改调用方式

demo3(1,2,3,*c,**d)

运行查看结果:

▶ python 05、函数的参数.py
param1 =  1
param2 =  2
param3 =  (3, 7, 8, 9)
age  =  12
name  =  TigerChain
sex  =  男

3、模拟用户注册登录「函数版」

demo:用户注册登录,并且用户名密码输入错误三次,锁定

# -*- coding:utf-8 -*-

'''
    这是一个函数版模拟用户注册登录
'''

# 定义保存用户名和密码的字典
userInfo = {}

# 是否登录的标志
islog = False

# 注册方法
def register():
    uname = raw_input("添加用户名: ")
    upass = raw_input("添加密码: ")
    userInfo[str(uname)] = upass
    print("注册成功")

# 登录方法
def login():
    for i in range(3):
        global islog
        if(islog):
            break
        username_input = raw_input('请输入用户名:')
        userpass_input = raw_input("请输入密码:")
        login_count = 2-i  # 判断还能输入多少次。
        for key in userInfo.keys():
            if(str(username_input) == key and userInfo[key]== userpass_input):
                print("欢迎 %s 登录"%key)
                islog = True
                break
            else:
                # 最后一次是 0 不再提示
                if login_count != 0:
                    print("用户名或密码错误,还可以输入 %d 次"%login_count)
        if(i==2):
            print("登录超过 3 次,半个小时后再登录")


register()
login()

运行查看结果:

06、python 系列之--函数_第3张图片
login_fun.gif

五、匿名函数

什么是匿名函数,顾名思义就是没有名字的函数

在 python 中使用 lambda 关建字来创建匿名函数「lambda 是一个表达多,不是一个语句」,格式如下:

lambda [arg1 [,arg2,.....argn]]:expression

demo1:使用 lambda 来创建一个加法运算函数

# 定义一个 labmda 表达式
sum = lambda a,b:a+b
print sum(1,4)

运行查看结果:

▶ python 07、匿名函数.py
5

demo2:使用 lambda 作为方法参数「函数式编程」

# 定义一个函数,参数分别是普通变量和一个函数
def fun(a,b,func):
    return func(a,b)
result = 0

e = ''

while True:
    if e=='e':
        break
    if e == 'c' or e =='':
        a = int(raw_input("请输入一个整数 a = "))
        b = int(raw_input("请输入一个整数 b = "))
        calc = raw_input("选择 + - * / 其中一项:")
        # 加法运算
        if calc == '+':
            result = fun(a,b,lambda a,b:a+b)
        # 减法运算
        elif calc == '-':
            result = fun(a,b,lambda a,b:a-b)
        # 乘法运算
        elif calc == "*":
            result = fun(a,b,lambda a,b:a*b)
        else:
        # 除法运算
            if b==0:
                print("被除数不能为0")
                continue 
            result = fun(a,b,lambda a,b:a/b)
        print result
        e = raw_input("退出请输入 e 继续请输入 c : ")

运行查看结果:

python 07、匿名函数.py
06、python 系列之--函数_第4张图片
lambda.gif

到此为止,我们就把函数的一些方法和功能基本介绍完了

你可能感兴趣的:(06、python 系列之--函数)