Comment utiliser les fonctions Python

WBOY
Libérer: 2023-05-08 12:07:17
avant
979 Les gens l'ont consulté

    1. Comment utiliser une fonction

    Définissez-la d'abord puis appelez-la La phase de définition détecte uniquement la syntaxe et n'exécute pas le code

    La phase d'appel commence à exécuter le code

    Les fonctions ont des valeurs de retour. ​​

    Il n'y a pas de paramètres lors de la définition et lors de l'appel. Il est également sans paramètre

    Il y a des paramètres lors de la définition, et il doit y avoir des paramètres lors de l'appel

    2. Le piège des paramètres par défaut

    2.1 est destiné aux types de données variables, aux données immuables. les types ne sont pas affectés

    def c(a=[]):
        a.append(1)
        print(a)
    c()
    c()
    c()
    Copier après la connexion

    Résultat :

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

    def c(a=[]):
        a.append(1)
        print(a)
    c([])
    c([])
    c([])
    Copier après la connexion

    Résultat :

    [1]
    [1]
    [1]

    3. Espace de noms et portée

    L'espace de noms est utilisé pour stocker L'endroit où l'adresse mémoire du nom est liée à la valeur (espace mémoire)

    Lors de la recherche d'une valeur, vous devez utiliser le nom et pour accéder au nom, vous devez rechercher l'espace de noms

    Les espaces de noms sont divisés en trois catégories

    Espaces de noms intégrés : Stocké C'est le nom qui accompagne l'interpréteur python

    Cycle de vie : Il prend effet au démarrage de l'interpréteur, et il devient invalide lorsque l'interpréteur est fermé

    Espace de noms global : il stocke le nom au niveau du fichier

    Cycle de vie : interprète et exécute python dans l'interpréteur Il prend effet lorsque le fichier est exécuté et devient invalide une fois le fichier exécuté. exécuté. Espace de noms local : le nom défini dans la fonction. Cycle de vie : l'espace de noms local de la fonction n'est généré que temporairement lorsque la fonction est appelée. Il devient invalide après l'appel de la fonction

    Built-in->. ;Global->Local

    L'ordre dans lequel les noms sont recherchés

    Recherchez en fonction de l'emplacement actuel

    En supposant que vous vous trouvez actuellement en local, l'ordre de recherche est : local->global-> ; Intégré

    En supposant que vous vous trouvez actuellement dans le monde global, l'ordre de recherche est : global-> L'ordre de recherche des noms intégrés

    a été corrigé lors de l'étape de définition de la fonction (c'est-à-dire la recherche l'ordre des noms a été déterminé lors de la vérification de la syntaxe), cela n'a rien à voir avec la position d'appel de la fonction

    C'est-à-dire que peu importe où vous appelez la fonction, vous devez retourner à l'endroit où la fonction a été initialement défini pour déterminer la relation de recherche du nom

    Portée : la portée fait référence à la portée de la fonction

    Effet global Domaine : contient les noms dans l'espace de noms intégré et l'espace de noms global

    Caractéristiques : valable globalement, globalement survivable

    Portée locale : contient les noms dans l'espace de noms local

    Caractéristiques : Survivabilité temporaire et valide localement

    global : déclare localement un nom provenant de la portée globale, qui peut être utilisé pour modifier localement le type immuable global

    nonlocal : déclare un nom qui provient d'une portée en dehors de la couche actuelle et peut être utilisé localement. Modifie le type immuable de la fonction externe

    4. La fonction de fermeture

    est définie à l'intérieur de la fonction et contient une référence au nom de la portée. de la fonction externe.Il doit être combiné avec le concept d'objets fonction pour renvoyer la fonction de fermeture dans la portée globale d'utilisation, brisant ainsi les restrictions hiérarchiques des fonctions

    La fonction de fermeture fournit une solution pour transmettre des valeurs à. le corps de la fonction

    def func():
        name='egon'
        def inner():
            print(name)
        return inner
    inner = func()
    inner()
    Copier après la connexion

    5. Paramètres de la fonction

    5.1 Phase de définition

    Paramètres de position

    Dans la phase de définition, des paramètres formels définis dans l'ordre de gauche à droite

    Paramètres formels par défaut

    Déjà initialisé et attribué dans la phase de définition

    Paramètres de mots-clés

    Thème gratuit

    Paramètre formel de longueur variable args

    overflow Paramètres de position, regroupés dans des tuples, acceptés, attribués au nom de variable d'args

    paramètres de mot-clé nommés

    les paramètres placés entre * et doivent être transmis sous la forme clé=valeur

    longueur variable Le paramètre formel positionnel kwargs

    les paramètres réels du mot-clé overflow sont regroupés dans un dictionnaire, acceptés par **, et attribués à la variable kwargs

    Relation entre les paramètres formels et les paramètres réels : lors de l'appel de la fonction, la valeur du paramètre réel sera liée au nom de la variable du paramètre formel. Cette relation de liaison est temporairement effective et deviendra invalide une fois l'appel terminé

    . 5.2 Phase d'appel

    Paramètres de position

    La phase d'appel est basée sur les valeurs entrantes transmises de gauche à droite et correspondra un à un aux paramètres formels

    Paramètres réels du mot clé.

    Dans la phase d'appel, les valeurs sont transmises aux paramètres formels selon le format clé=valeur Pour ceux avec * dans les paramètres réels, avant de transmettre la valeur Sera décomposée en paramètres positionnels, puis attribuée

    . Le ** dans le paramètre réel sera divisé en arguments de mot-clé avant de transmettre la valeur, puis attribué

    6 Décorateur : fonction de fermeture Application

    Decorator est un outil utilisé pour ajouter de nouvelles fonctions à l'objet décoré

    **Remarque. :** Le décorateur lui-même peut être n'importe quel objet appelable, et l'objet décoré peut également être n'importe quel objet appelable

    Pourquoi utiliser des décorateurs

    **Principe ouvert et fermé : **Fermé signifie être fermé aux modifications et ouvert aux extensions

    6.1 L'implémentation des décorateurs doit suivre deux principes majeurs

    1. Ne pas modifier le code source de l'objet décoré`

    2. Ne pas modifier la méthode d'appel de l'objet décoré

    Le but du décorateur : ajouter. de nouvelles fonctions à l'objet décoré tout en suivant les principes 1 et 2

    6.2 Sucre syntaxique du décorateur

    Après avoir été décoré Écrivez le nom du @décorateur sur une ligne séparée directement au-dessus de l'objet

    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('run time is %s' %(stop_time-start_time))
            return res
        return wrapper
    
    @timmer
    def foo():
        time.sleep(3)
        print('from foo')
    foo()
    Copier après la connexion

    6.4有参装饰器

    def auth(driver='file'):
        def auth3(func):
            def wrapper(*args,**kwargs):
                name=input("user: ")
                pwd=input("pwd: ")
    
            if driver == 'file':
                if name == 'egon' and pwd == '123':
                    print('login successful')
                    res=func(*args,**kwargs)
                    return res
            elif driver == 'ldap':
                print('ldap')
        return wrapper
    return auth3
    
    @auth(driver='file')
    def foo(name):
        print(name)
    
    foo('egon')
    Copier après la connexion

    7.题目

    #题目一:
    db='db.txt'
    login_status={'user':None,'status':False}
    def auth(auth_type='file'):
        def auth3(func):
            def wrapper(*args,**kwargs):
                if login_status['user'] and login_status['status']:
                    return func(*args,**kwargs)
                if auth_type == 'file':
                    with open(db,encoding='utf-8') as f:
                        dic=eval(f.read())
                    name=input('username: ').strip()
                    password=input('password: ').strip()
                    if name in dic and password == dic[name]:
                        login_status['user']=name
                        login_status['status']=True
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('username or password error')
                elif auth_type == 'sql':
                    pass
                else:
                    pass
            return wrapper
        return auth3
    
    @auth()
    def index():
        print('index')
    
    @auth(auth_type='file')
    def home(name):
        print('welcome %s to home' %name)
    
    
    # index()
    # home('egon')
    
    #题目二
    import time,random
    user={'user':None,'login_time':None,'timeout':0.000003,}
    
    def timmer(func):
        def wrapper(*args,**kwargs):
            s1=time.time()
            res=func(*args,**kwargs)
            s2=time.time()
            print('%s' %(s2-s1))
            return res
        return wrapper
    
    
    def auth(func):
        def wrapper(*args,**kwargs):
            if user['user']:
                timeout=time.time()-user['login_time']
                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()
    Copier après la connexion

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!