Rumah > pembangunan bahagian belakang > Tutorial Python > Cara menggunakan fungsi Python

Cara menggunakan fungsi Python

WBOY
Lepaskan: 2023-05-08 12:07:17
ke hadapan
1036 orang telah melayarinya

    1 Cara menggunakan fungsi

    untuk mentakrifkannya dahulu dan kemudian memanggilnya Dalam fasa definisi, hanya sintaks yang dikesan dan kod tidak dilaksanakan.

    Dalam fasa panggilan, mulakan Kod pelaksanaan

    Semua fungsi mempunyai nilai pulangan

    Tiada parameter semasa mentakrifkan dan tiada parameter semasa memanggil

    Terdapat parameter semasa mentakrifkan dan mesti ada parameter semasa memanggil

    2. Perangkap parameter lalai

    2.1 Untuk jenis data boleh ubah, kebolehubah tidak terjejas

    def c(a=[]):
        a.append(1)
        print(a)
    c()
    c()
    c()
    Salin selepas log masuk

    Keputusan:

    [1]
    [ 1, 1]
    [1, 1, 1]

    def c(a=[]):
        a.append(1)
        print(a)
    c([])
    c([])
    c([])
    Salin selepas log masuk

    Keputusan:

    [1]
    [1]
    [1]

    3. Ruang nama dan skop

    Ruang nama ialah tempat perhubungan yang mengikat antara nama dan alamat memori nilai disimpan (ruang memori)

    Sebarang carian Nilai mesti melepasi nama Untuk mengakses nama, anda mesti mencari ruang nama

    ruang nama dibahagikan kepada tiga kategori:

    Ruang nama terbina dalam: Ruang nama yang disertakan dengan penterjemah python disimpan Nama

    Kitaran hayat: berkuat kuasa apabila penterjemah dimulakan, dan menjadi tidak sah apabila jurubahasa ditutup

    Ruang nama global: menyimpan nama peringkat fail

    kitaran hayat: Ia berkuat kuasa apabila jurubahasa mentafsir dan melaksanakan fail ular sawa, dan menjadi tidak sah selepas fail dilaksanakan.

    Ruang nama setempat: Nama yang ditakrifkan dalam fungsi

    Kitaran hayat: Ini hanya dijana buat sementara apabila fungsi itu dipanggil, yang akan menjadi tidak sah selepas fungsi dipanggil

    Memuatkan pesanan

    Terbina dalam>Global->Tempatan

    Susunan carian nama

    Cari ke atas berdasarkan lokasi semasa

    Dengan mengandaikan anda sedang berada di kawasan setempat, susunan carian ialah: global-> 🎜>

    Dengan mengandaikan bahawa anda kini berada di dunia global, susunan carian ialah: global -> Urutan carian bagi nama

    terbina dalam telah ditetapkan semasa peringkat definisi fungsi (iaitu , susunan carian nama telah ditentukan apabila menyemak sintaks). kembali ke tempat di mana fungsi asalnya ditakrifkan untuk menentukan hubungan carian nama

    Skop: Skop merujuk kepada Ia adalah skop tindakan

    Skop global: Mengandungi nama dalam binaan -dalam ruang nama dan ruang nama global

    Ciri: Kemandirian global yang sah secara global

    Skop setempat: Mengandungi nama dalam ruang nama tempatan

    Ciri: Kemandirian sementara yang sah di peringkat tempatan

    global: Mengisytiharkan nama secara tempatan berasal daripada skop global dan boleh digunakan untuk mengubah suai jenis global setempat Tidak boleh ubah

    bukan tempatan: mengisytiharkan nama daripada skop lapisan luar lapisan semasa, yang boleh digunakan untuk mengubah suai secara tempatan jenis tidak boleh ubah bagi fungsi luar

    4. Penutupan Fungsi

    ditakrifkan di dalam fungsi dan mengandungi rujukan kepada nama skop fungsi luaran Ia adalah perlu untuk menggabungkan konsep objek fungsi untuk mengembalikan fungsi penutupan kepada skop global untuk digunakan, dengan itu memecahkan sekatan hierarki fungsi

    Fungsi penutupan menyediakan penyelesaian untuk menghantar nilai ke badan fungsi

    def func():
        name='egon'
        def inner():
            print(name)
        return inner
    inner = func()
    inner()
    Salin selepas log masuk

    5. Parameter fungsi

    5.1 Peringkat definisi

    Parameter bentuk kedudukan

    Parameter formal yang ditakrifkan mengikut urutan dari kiri ke betul-betul dalam fasa definisi

    Parameter formal lalai

    sudah dalam fasa definisi Tugasan permulaannya

    Parameter kata kunci

    Tema percuma

    Args parameter formal panjang boleh ubah

    Parameter kedudukan yang melimpah, Pek ke dalam tupel, terima dan tetapkan nama pembolehubah kepada args

    Parameter kata kunci bernama

    Parameter diletakkan di antara * dan mesti mengikut key=value Nilai yang dilalui dalam bentuk

    parameter kedudukan pembolehubah panjang kwargs

    parameter sebenar kata kunci limpahan, dibungkus ke dalam kamus, diterima oleh **, diperuntukkan kepada bentuk kwargs pembolehubah

    Hubungan antara parameter dan parameter sebenar: Apabila memanggil fungsi, nilai parameter sebenar akan terikat pada nama pembolehubah formal parameter. Hubungan mengikat ini berkuat kuasa buat sementara waktu dan akan menjadi tidak sah selepas panggilan selesai

    5.2 Fasa Panggilan

    Parameter kedudukan

    Nilai-nilai dihantar dari kiri ke kanan semasa fasa panggilan akan sepadan dengan parameter rasmi satu-ke-satu

    Parameter sebenar kata kunci

    Dalam fasa panggilan, lulus nilai kepada parameter formal mengikut format key=value

    Jika terdapat * dalam parameter sebenar, kemudian hantar nilai Sebelum menghantar nilai, pecahkan dahulu ke dalam parameter sebenar kedudukan, dan kemudian tetapkan nilai <. 🎜>

    dengan ** dalam parameter sebenar Sebelum menghantar nilai, pecahkannya kepada parameter sebenar kata kunci, dan kemudian tetapkan nilai

    6 >Penghias ialah alat yang digunakan untuk menambah fungsi baharu pada objek yang dihias

    **Nota:** Penghias itu sendiri boleh menjadi apa sahaja Objek boleh dipanggil, objek yang dihias juga boleh menjadi objek boleh dipanggil

    Mengapa menggunakan penghias

    **Prinsip terbuka dan tertutup: **Tertutup merujuk kepada ditutup kepada pengubahsuaian dan ditutup kepada sambungan Terbuka

    6.1 Pelaksanaan penghias mesti mengikut dua prinsip utama

    1. Jangan ubah suai kod sumber objek yang dihias`

    2. Jangan ubah suai panggilan objek yang dihias Kaedah

    Matlamat penghias: untuk menambah fungsi baharu ke objek yang dihias sambil mengikut prinsip 1 dan 2

    6.2 Gula sintaks penghias

    selepas dihias Tulis nama @penghias pada baris berasingan betul-betul di atas objek

    python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名 foo=auth(foo) 此时的foo是闭包函数wrapper

    6.3无参装饰器

    import time
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print(&#39;run time is %s&#39; %(stop_time-start_time))
            return res
        return wrapper
    
    @timmer
    def foo():
        time.sleep(3)
        print(&#39;from foo&#39;)
    foo()
    Salin selepas log masuk

    6.4有参装饰器

    def auth(driver=&#39;file&#39;):
        def auth3(func):
            def wrapper(*args,**kwargs):
                name=input("user: ")
                pwd=input("pwd: ")
    
            if driver == &#39;file&#39;:
                if name == &#39;egon&#39; and pwd == &#39;123&#39;:
                    print(&#39;login successful&#39;)
                    res=func(*args,**kwargs)
                    return res
            elif driver == &#39;ldap&#39;:
                print(&#39;ldap&#39;)
        return wrapper
    return auth3
    
    @auth(driver=&#39;file&#39;)
    def foo(name):
        print(name)
    
    foo(&#39;egon&#39;)
    Salin selepas log masuk

    7.题目

    #题目一:
    db=&#39;db.txt&#39;
    login_status={&#39;user&#39;:None,&#39;status&#39;:False}
    def auth(auth_type=&#39;file&#39;):
        def auth3(func):
            def wrapper(*args,**kwargs):
                if login_status[&#39;user&#39;] and login_status[&#39;status&#39;]:
                    return func(*args,**kwargs)
                if auth_type == &#39;file&#39;:
                    with open(db,encoding=&#39;utf-8&#39;) as f:
                        dic=eval(f.read())
                    name=input(&#39;username: &#39;).strip()
                    password=input(&#39;password: &#39;).strip()
                    if name in dic and password == dic[name]:
                        login_status[&#39;user&#39;]=name
                        login_status[&#39;status&#39;]=True
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print(&#39;username or password error&#39;)
                elif auth_type == &#39;sql&#39;:
                    pass
                else:
                    pass
            return wrapper
        return auth3
    
    @auth()
    def index():
        print(&#39;index&#39;)
    
    @auth(auth_type=&#39;file&#39;)
    def home(name):
        print(&#39;welcome %s to home&#39; %name)
    
    
    # index()
    # home(&#39;egon&#39;)
    
    #题目二
    import time,random
    user={&#39;user&#39;:None,&#39;login_time&#39;:None,&#39;timeout&#39;:0.000003,}
    
    def timmer(func):
        def wrapper(*args,**kwargs):
            s1=time.time()
            res=func(*args,**kwargs)
            s2=time.time()
            print(&#39;%s&#39; %(s2-s1))
            return res
        return wrapper
    
    
    def auth(func):
        def wrapper(*args,**kwargs):
            if user[&#39;user&#39;]:
                timeout=time.time()-user[&#39;login_time&#39;]
                if timeout < user[&#39;timeout&#39;]:
                    return func(*args,**kwargs)
            name=input(&#39;name>>: &#39;).strip()
            password=input(&#39;password>>: &#39;).strip()
            if name == &#39;egon&#39; and password == &#39;123&#39;:
                user[&#39;user&#39;]=name
                user[&#39;login_time&#39;]=time.time()
                res=func(*args,**kwargs)
                return res
        return wrapper
    
    @auth
    def index():
        time.sleep(random.randrange(3))
        print(&#39;welcome to index&#39;)
    
    @auth
    def home(name):
        time.sleep(random.randrange(3))
        print(&#39;welcome %s to home &#39; %name)
    
    index()
    home(&#39;egon&#39;)
    
    #题目三:简单版本
    import requests
    import os
    cache_file=&#39;cache.txt&#39;
    def make_cache(func):
        def wrapper(*args,**kwargs):
            if not os.path.exists(cache_file):
                with open(cache_file,&#39;w&#39;):pass
    
            if os.path.getsize(cache_file):
                with open(cache_file,&#39;r&#39;,encoding=&#39;utf-8&#39;) as f:
                    res=f.read()
            else:
                res=func(*args,**kwargs)
                with open(cache_file,&#39;w&#39;,encoding=&#39;utf-8&#39;) as f:
                    f.write(res)
            return res
        return wrapper
    
    @make_cache
    def get(url):
        return requests.get(url).text
    
    
    # res=get(&#39;https://www.python.org&#39;)
    
    # print(res)
    
    #题目四:扩展版本
    import requests,os,hashlib
    engine_settings={
        &#39;file&#39;:{&#39;dirname&#39;:&#39;./db&#39;},
        &#39;mysql&#39;:{
            &#39;host&#39;:&#39;127.0.0.1&#39;,
            &#39;port&#39;:3306,
            &#39;user&#39;:&#39;root&#39;,
            &#39;password&#39;:&#39;123&#39;},
        &#39;redis&#39;:{
            &#39;host&#39;:&#39;127.0.0.1&#39;,
            &#39;port&#39;:6379,
            &#39;user&#39;:&#39;root&#39;,
            &#39;password&#39;:&#39;123&#39;},
    }
    
    def make_cache(engine=&#39;file&#39;):
        if engine not in engine_settings:
            raise TypeError(&#39;egine not valid&#39;)
        def deco(func):
            def wrapper(url):
                if engine == &#39;file&#39;:
                    m=hashlib.md5(url.encode(&#39;utf-8&#39;))
                    cache_filename=m.hexdigest()
                    cache_filepath=r&#39;%s/%s&#39; %(engine_settings[&#39;file&#39;][&#39;dirname&#39;],cache_filename)
    
                    if os.path.exists(cache_filepath) and os.path.getsize(cache_filepath):
                        return open(cache_filepath,encoding=&#39;utf-8&#39;).read()
    
                    res=func(url)
                    with open(cache_filepath,&#39;w&#39;,encoding=&#39;utf-8&#39;) as f:
                        f.write(res)
                    return res
                elif engine == &#39;mysql&#39;:
                    pass
                elif engine == &#39;redis&#39;:
                    pass
                else:
                    pass
    
            return wrapper
        return deco
    
    @make_cache(engine=&#39;file&#39;)
    def get(url):
        return requests.get(url).text
    
    # print(get(&#39;https://www.python.org&#39;))
    print(get(&#39;https://www.baidu.com&#39;))
    
    
    #题目五
    route_dic={}
    
    def make_route(name):
        def deco(func):
            route_dic[name]=func
        return deco
    @make_route(&#39;select&#39;)
    def func1():
        print(&#39;select&#39;)
    
    @make_route(&#39;insert&#39;)
    def func2():
        print(&#39;insert&#39;)
    
    @make_route(&#39;update&#39;)
    def func3():
        print(&#39;update&#39;)
    
    @make_route(&#39;delete&#39;)
    def func4():
        print(&#39;delete&#39;)
    
    print(route_dic)
    
    
    #题目六
    import time
    import os
    
    def logger(logfile):
        def deco(func):
            if not os.path.exists(logfile):
                with open(logfile,&#39;w&#39;):pass
    
            def wrapper(*args,**kwargs):
                res=func(*args,**kwargs)
                with open(logfile,&#39;a&#39;,encoding=&#39;utf-8&#39;) as f:
                    f.write(&#39;%s %s run\n&#39; %(time.strftime(&#39;%Y-%m-%d %X&#39;),func.__name__))
                return res
            return wrapper
        return deco
    
    @logger(logfile=&#39;aaaaaaaaaaaaaaaaaaaaa.log&#39;)
    def index():
        print(&#39;index&#39;)
    
    index()
    Salin selepas log masuk

    Atas ialah kandungan terperinci Cara menggunakan fungsi Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan