Python函数基础

1 函数存在的意义

  • 1,减少重复的代码

  • 2,可读性强

  • 3,以功能为导向

  • 4,函数里面形参和实参

1.1 函数语法

'''
def 函数名(参数1,参数2,参数3,...):
    注释
    函数体
    return 返回的值
什么时候该有返回值?
    调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
    通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
    调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
    通常无参函数不需要有返回值
'''

def fun():
    return 1

print(fun())

1.2  函数参数

'''
#1、位置参数:按照从左到右的顺序定义的参数
        位置形参:必选参数
        位置实参:按照位置给形参传值

#2、关键字参数:按照key=value的形式定义的实参
        无需按照位置为形参传值
        注意的问题:
                1. 关键字实参必须在位置实参右面
                2. 对同一个形参不能重复传值

#3、默认参数:形参在定义时就已经为其赋值
        可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
        注意的问题:
                1. 只在定义时赋值一次
                2. 默认参数的定义应该在位置形参右面
                3. 默认参数通常应该定义成不可变类型

#4、可变长参数:
        可变长指的是实参值的个数不固定
        而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
'''

#*args
def fun_args(x,y,*args):
    print(x,y)
    print(args)

fun_args(1,2,3,4,5,6)    #多余的位置参数会放到一个元组中

def fun_args(x,y,*args):
    print(x,y)
    print(args)

fun_args(1,2,*[3,4,5,6]) #会打散放到一个元组中


#**kwargs
def fun_kwargs(a,b,**kwargs):
    print(a,b)
    print(kwargs)

fun_kwargs(a=1,b=2,c=3)                     #多余的关键字参数会存入到一个字典中

def fun_kwargs(a,b,**kwargs):
    print(a,b)
    print(kwargs)

fun_kwargs(a=1,b=2,**{"c":3,"d":4})         #会打散字典存入到一个字典中

def fun_args_kwargs(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)

fun_args_kwargs(1,2,3,4,5,a=1,b=2,c=3)

1.3 函数嵌套  

#替代if
def fun1():
    return 1
def fun2():
    return 2

dic={
    "fun1":fun1,
    "fun2":fun2,
}

choice=input("your choice>>:").strip()
if choice in dic:
    print(dic[choice]())
#
# #比较大小
def my_max(x,y):
    return x if x >y else y

print(my_max(1,2))

def my_maximum(a,b,c,d):
    res=my_max(a,b)
    res1=my_max(res,c)
    res2=my_max(res1,d)
    return res2

print(my_maximum(1,2,3,4))

x=100
def fun1(): 
    #global x 加上则全局变量更在在fun1函数中,fun2的x不生效
    x=1    
    print(x)
    def fun2():
        x=2
        print(x)
    fun2()
    print(globals())   #显示所有的全局变量
    print(locals())    #显示所有的局部变量

fun1()
print(x)

1.4 闭包函数  

#内部函数包含对外部作用域而非全局作用域的引用
#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)

from urllib.request import urlopen

def index(url):
    def get():
        return urlopen(url).read()

    return get

baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))

1.5 装饰器

#内部函数包含对外部作用域而非全局作用域的引用
#提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来)

from urllib.request import urlopen

def index(url):
    def get():
        return urlopen(url).read()

    return get

baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))


#装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
#强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
#装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
#开放封闭原则:对修改封闭,对扩展开放


import time

def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func()
        end_time=time.time()
        res=end_time-start_time
        return res
    return wrapper

@timer
def fun1():
    time.sleep(1)
    print("fun1:sleep 1")

@timer
def fun2():
    time.sleep(2)
    print("fun2:sleep 2")

@timer
def fun3():
    time.sleep(3)
    print("fun3:sleep 3")

fun1()
fun2()
fun3()

  

 

  

原文地址:https://www.cnblogs.com/so-cool/p/8847740.html