zoukankan      html  css  js  c++  java
  • 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()
    

      

     

      

  • 相关阅读:
    好文摘录
    使用jsoup进行网页内容抓取
    JAX-WS开发WebService程序
    Jboss中不能正常的解析EL表达式
    Android 使用弹出对话框,报Unable to add window错误
    JavaScript Math对象
    javascript Date对象
    使用ListView 时,遇到了 Your content must have a ListView whose id attribute is 'android.R.id.list' 错误
    javascript Array对象
    LeetCode --- 字符串系列 --- URL化
  • 原文地址:https://www.cnblogs.com/so-cool/p/8847740.html
Copyright © 2011-2022 走看看