python函数

函数:把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的使用包含两个步骤
1.定义函数–封装独立的功能
2.调用函数–享受封装的成果
函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用‘’
函数:
函数是带名字的代码块,用于完成具体的工作
需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,而只需调用该任务的函数,让python运行其中的代码,通过使用函数,程序编写,阅读,测试和修复都将更容易

定义函数 def 函数名():
函数封装的代码
1.def是英文define的缩写
2.函数名称应该能够表达函数封装代码的功能,方便后续的调用
3.函数名称的命名应该符合标识符的命名规则
可由字母,下划线和数字组成 不能以数字开头
不能与关键字重名

func_01.py

# _*_ coding:utf-8 _*_
"""
file:func_01.py
date:2018-07-19 1:58 PM
author:wwy
desc:

"""
# 定义好一个函数之后,只是表示这个函数封装了一段代码
# 如果不主动调用函数,函数不会执行
def say_hello():
    print 'hello1'
    print 'hello2'
    print 'hello3'
# 调用函数
say_hello()

运行结果:
这里写图片描述
func_02.py

# _*_ coding:utf-8 _*_
"""
file:func_02.py
date:2018-07-19 2:04 PM
author:wwy
desc:

"""
# 能实现两个数字的求和
def sum_2_sum():
    num1 = 10
    num2 = 20
    result = num1 + num2
    print '%d + %d = %d' %(num1,num2,result)
sum_2_sum()

运行结果:
这里写图片描述

参数的作用
函数,把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的参数,增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据
1.在函数内部,把参数当作变量使用,进行需要的数据处理
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递
形参和实参
形参:定义函数时,小括号中的参数,是用来接收参数用的,在函数内部作为变量使用
实参:调用函数时,小括号中的参数,是用来把数据传递到函数内部用的

func_03.py

# _*_ coding:utf-8 _*_
"""
file:func_03.py
date:2018-07-19 2:06 PM
author:wwy
desc:

"""
# 形参:定义函数时,小括号中的参数,是用来接受参数使用
# 在函数内部,是当作变量来用的
def sum_2_sum(num1,num2):
    """对两个数字求和"""         #ctrl+q进行查看
    result = num1 + num2
    print '%d + %d = %d' %(num1,num2,result)
# 实参:调用函数时使用,小括号中的参数
# 是用来把数据传输到形参中
sum_2_sum(20,15)

运行结果:
这里写图片描述
func_04.py

# _*_ coding:utf-8 _*_
"""
file:func_04.py
date:2018-07-19 2:10 PM
author:wwy
desc:

"""
def num(*a):                   #当不确定有多少个参数时用“ * ”表示
    print a
num(1)
num(1,2)
num(1,2,3)
num(1,2,3,4,5)

运行结果:
这里写图片描述

函数的返回值
在程序开发中,有时候,会希望一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果作出后续的处理
返回值是函数完成工作后,最后给调用者的一个结果
在函数中使用return关键字可以返回结果
调用函数一方,可以使用变量来接收函数的返回结果

func_05.py

# _*_ coding:utf-8 _*_
"""
file:func_05.py
date:2018-07-19 2:13 PM
author:wwy
desc:
返回值:是函数完成工作后,最后给调用者的一个结果
在函数中使用return关键字可以返回结果
return的后续代码不会执行(print 'hello'不执行)
调用函数一方,可以使用变量来接受函数的返回结果
"""

def sum_2_sum(num1,num2):
    """对两个数字求和"""
    result = num1 +num2
    return result
    # print 'hello'
# 使用返回值,告诉调用方计算结果是什么
sum_result =  sum_2_sum(60,20)
# 可以使用一个变量,来接收函数执行的结果
print sum_result

运行结果:
这里写图片描述
func_06.py

# _*_ coding:utf-8 _*_
"""
file:func_06.py
date:2018-07-19 2:17 PM
author:wwy
desc:

"""
# 1.定义一个函数,能够打印*组成的一条分隔线

def print_line():
    print '*' * 50
print_line()


# 2.定义一个函数能够打印任意字符串组成的分割线

def print_line(char):
    print char * 50
print_line('#')


# 3.定义一个函数能够打印任意重复次数的分割线

def print_line(char,times):
    print char * times
print_line('~',50)


# 4.定义一个函数能够打印五行分割线,分割线符合要求3

def print_lines(char,times):        #点击print_lines选择insert
    """打印多行分割线

    :param char:分割线使用的分割字符
    :param times:分割符重复的次数
    """
    row = 0
    while row <= 5:
        print_line(char,times)
        row += 1
print_lines('!',23)

运行结果:
这里写图片描述
点击print_lines,ctrl+Q会显示对该函数的定义
这里写图片描述
func_07.py

# _*_ coding:utf-8 _*_
"""
file:func_07.py
date:2018-07-19 2:22 PM
author:wwy
desc:
模块文件:每一个python源文件都可以是一个模块文件
可以在一个python文件中定义函数或变量
然后在另一个文件中使用import filename 导入这个模块
导入之后,就可以使用模块名.变量/模块名.函数的方式
使用这个模块中定义的函数和变量
"""

import func_03, func_06

func_03.sum_2_sum(2, 6)
func_06.print_lines('#', 5)

运行结果:
这里写图片描述

局部变量和全局变量

局部变量:
局部变量是在函数内部定义的变量,只能在函数内部使用,临时保存函数内部需要使用的数据
函数执行结束后,函数内部的局部变量,会被系统回收
不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响
全局变量:
全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量

func_08.py

# _*_ coding:utf-8 _*_
"""
file:func_08.py
date:2018-07-19 2:39 PM
author:wwy
desc:

"""
def demo1():
    # 定义一个局部变量
    num = 10
    print num

# 在函数内部定义的变量,不能在其他位置使用
#print num
demo1()
#print num

运行结果:
这里写图片描述
func_09.py

# _*_ coding:utf-8 _*_
"""
file:func_09.py
date:2018-07-19 2:42 PM
author:wwy
desc:

"""
def demo1():
    # 定义一个局部变量
    # 出生:执行了下方的代码后才会被创建
    # 死亡:函数执行完后
    num = 10
    print num
    num = 20
    print num
def demo2():
#   print num
# demo1中定义的局部变量,不能在其他函数中使用
    pass
demo1()
demo2()

运行结果:
这里写图片描述
func_10.py

# _*_ coding:utf-8 _*_
"""
file:func_10.py
date:2018-07-19 2:42 PM
author:wwy
desc:

"""
def demo1():
    num = 10
    print num
def demo2():
#   num = 20     #这样定义在下次调用时不能确认到底是哪个
    demo2_num = 20
    print demo2_num

demo1()
demo2()

运行结果:
这里写图片描述
func_11.py

# _*_ coding:utf-8 _*_
"""
file:func_11.py
date:2018-07-19 2:50 PM
author:wwy
desc:

"""
num = 10

def demo1():
    print 'demo1=====>%d' %num
def demo2():
    print 'demo2=====>%d' %num

demo1()
demo2()

运行结果:
这里写图片描述
改进:

"""
file:func_12.py
date:2018-07-19 2:52 PM
author:wwy
desc:

"""
num = 10

def demo1():
    # 使用赋值语句,会在函数内部,定义一个局部变量
    num = 18
    print 'demo1=====>%d' %num
def demo2():
    print 'demo2=====>%d' %num

运行结果:
这里写图片描述
func_13.py

# _*_ coding:utf-8 _*_
"""
file:func_13.py
date:2018-07-19 2:54 PM
author:wwy
desc:

"""
num = 10

def demo1():
    # 希望修改全局变量,使用global关键字,声明一下变量即可
    # global 关键字会告诉解释器后面是一个全局变量
    # 再用赋值语句时,就不会创建局部变量了
    global num
    num = 18
    print 'demo1=====>%d' %num
def demo2():
    print 'demo2=====>%d' %num

demo1()
demo2()

运行结果:
这里写图片描述
func_14.py

# _*_ coding:utf-8 _*_
"""
file:func_14.py
date:2018-07-19 2:56 PM
author:wwy
desc:
注意:在开发的时候,应该把模块中的所有全局变量
定义在其他函数上方

"""

gl_num = 10             # 修改全文某变量:右击该变量选择refactor
gl_title = 'python'
gl_name = 'zmy'

def demo():
    print '%d' % gl_num
    print '%s' % gl_title           # %s 字符串
    print '%s' % gl_name

demo()

运行结果:
这里写图片描述
func_15.py

# _*_ coding:utf-8 _*_
"""
file:func_15.py
date:2018-07-19 2:57 PM
author:wwy
desc:

"""
gl_num = 10

def demo1():
    num = 99
    print num
    print gl_num
def demo2():
    print gl_num

demo1()
demo2()

运行结果:
这里写图片描述

引用

变量的引用
变量和数据都是保存在内存中的
在python中函数的参数传递以及返回值都是靠引用传递的
引用的概念:
在python中
变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存的是数据在内存中的地址
变量中记录数据的地址,就叫做引用
使用id()函数可以查看变量中保存数据所在内存的地址

引用——01.py

# _*_ coding:utf-8 _*_
"""
file:引用——01.py
date:2018-07-19 3:01 PM
author:wwy
desc:

"""
# 定义了一个函数,准备另一个叫num变量
# 引用的是数字10的内存地址
def test(num):
    print '在函数内部 %d 对应的内存地址是 %d' %(num,id(num))

a = 10
print 'a 变量保存数据内存的地址是 %d' %(id(a))

test(a)

运行结果:
这里写图片描述
引用——02.py

# _*_ coding:utf-8 _*_
"""
file:引用——02.py
date:2018-07-19 3:03 PM
author:wwy
desc:

"""
def test(num):
    print '在函数内部 %d 对应的内存地址是 %d' %(num,id(num))
    # 定义一个字符串变量
    result = 'hello'
    print '函数要返回数据的内存地址是 %d' %id(result)
    return result

a = 10
print 'a 变量保存数据内存的地址是 %d' %(id(a))

r = test(a)
print '%s 的内存地址是 %d' %(r,id(r))

运行结果:
这里写图片描述

装饰器

装饰器——01.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——01.py
date:2018-07-19 3:09 PM
author:wwy
desc:
装饰器:把一个函数当作参数,传递给函数
返回一个加强版的函数
本质上是一个返回函数的函数
“在不改变函数上的基础上,给函数添加功能”
"""

def func1():
    print 'have a nice day !'
def func2():
    print 'hello python !'
# 需求: 让func1函数的执行前面加一串*
# 但是不改变原函数


# outer()就相当于是一个“化妆师”
# 将传递进来的参数“化妆”,然后返回“化妆好了的函数”
# 这里为什么要有一个形参:因为“化妆师可以给每个人化妆
def outer(func):
    def inner():
        print '**********'
        func()
    # 将装饰好的函数返回
    return inner

# f是func1的加强版本,其实就是inner()
f = outer(func1)
f()

q = outer(func2)
q()

运行结果:
这里写图片描述
装饰器——02.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——02.py
date:2018-07-19 3:11 PM
author:wwy
desc:

"""
def say(age):
    print 'man is %d years old' % age

def outer(func):
    def inner(age):
        if age < 0:
            age = 0
        func(age)
    return inner

# 得到了一个“化妆”过的函数
say = outer(say)
# 要想执行函数,我们海的重新调用新的函数
say(10)

运行结果:
这里写图片描述
装饰器——03.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——03.py
date:2018-07-19 3:12 PM
author:wwy
desc:

"""
def outer(func):
    def inner(age):
        if age < 0:
            age = 0
        func(age)
    return inner

# 得到了一个“化妆”过的函数
#say = outer(say)
# 要想执行函数,我们海的重新调用新的函数
#say(10)

# 使用@符号将装饰器应用到函数
@outer
def say(age):
    print 'man is %d years old' % age
say(6)

运行结果:
这里写图片描述
装饰器——04.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——04.py
date:2018-07-19 3:14 PM
author:wwy
desc:
设置3个函数,前后都装饰

"""


def outer(fun):
    def wrapper():
        print '验证信息'
        fun()
        print'~~~~~'
    return wrapper


@outer      # func1 =outer(func1)
def func1():
    print 'func1'
func1()
@outer
def func2():
    print 'func2'
func2()
@outer
def func3():
    print 'func3'
func3()

运行结果:
这里写图片描述
装饰器——05.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——05.py
date:2018-07-19 3:16 PM
author:wwy
desc:

"""
def outer(func):
    def inner(*args):             # *args:可变长形参
        print '#############'
        func(*args)
    return inner

@outer
def say(name,age):
    print 'my name is %s,I am %d years old' %(name,age)
say('zmy',20)

运行结果:
这里写图片描述
装饰器——06.py

# _*_ coding:utf-8 _*_
"""
file:装饰器——06.py
date:2018-07-19 3:18 PM
author:wwy
desc:

"""
def outer(fun):
    def wapper(arg):
        print '验证信息'
        result = fun(arg)
        print '^-^ QAQ ^^^^^^^'
        return result
    return wapper

@outer
def func1(arg):
    print 'func1',arg
    print '#########'
    return 'return'
response = func1('westos')
print response

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值