Fonctions de la série Python Full Stack Road

高洛峰
Libérer: 2017-02-09 10:50:09
original
1660 Les gens l'ont consulté

Fonction

La fonction est la structure de programme la plus basique fournie par Python pour maximiser la réutilisation du code et minimiser la redondance du code.

  1. Fonctionnel : encapsulez un certain code fonctionnel dans une fonction, il n'est donc pas nécessaire de le réécrire à l'avenir, appelez simplement la fonction

  2. Orienté objet : classer et encapsuler les fonctions pour rendre le développement "plus rapide, meilleur et plus fort..."

La chose la plus importante dans la programmation fonctionnelle est d'améliorer la réutilisabilité et la lisibilité du code

Syntaxe de la fonction créée

def 函数名(参数):
    ...
    函数体
    ...
    返回值
Copier après la connexion
Copier après la connexion

Exemple simple

# x为函数的参数
>>> def num(x):
...  print(x)
...
# 123456等于x
>>> num("123456")
123456
Copier après la connexion
Copier après la connexion

La valeur de retour de la fonction

La valeur de retour de la fonction doit utilisez returnce mot-clé, la valeur de retour est principalement utilisée pour accepter le résultat de l'exécution de la fonction

>>> def re():
...   if 1==1:
...     return True
...   else:
...     return False
...
>>> re()
True
Copier après la connexion
Copier après la connexion

Quelle que soit la valeur qui suit le retour de la fonction, re renverra quelle que soit la valeur si la valeur de retour ne l'est pas. spécifié, un paramètre par défaut sera renvoyé None

Dans la fonction, lorsque return est exécuté, le code suivant return ne sera pas exécuté

>>> def ret():
...  print("123")
...  return True
...  print("abc")
...
>>> ret()
123
True
Copier après la connexion
Copier après la connexion

Paramètres de position.

Les valeurs des paramètres transmis sont attribuées dans l'ordre.

Code

# x==形式参数,形式参数有几个,那么实际参数就要传几个,默认参数除外
def ret(x):
    print(x)
# "Hello Word"实际参数
print(ret("Hello Word"))
Copier après la connexion
Copier après la connexion

Résultat de l'exécution

Hello Word
Copier après la connexion
Copier après la connexion

Comme le montre la figure :
Fonctions de la série Python Full Stack Road

ret la valeur dans le parenthèses Il sera passé dans la fonction ret et la valeur de Un email sera envoyé à l'adresse email print("Hello Word").

Remarque :
def email(mail):
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    msg = MIMEText('邮件内容', 'plain', 'utf-8')
    msg['From'] = formataddr(["测试",'asdasd@126.com'])
    msg['To'] = formataddr(["走人",'asdasdasd@163.com'])
    msg['Subject'] = "主题"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("wdfgfghfgh@126.com", "123456")
    server.sendmail('asdasdas@126.com', [mail,], msg.as_string())
    server.quit()

email("6087414@qq.com")
Copier après la connexion
Copier après la connexion
Les adresses e-mail ci-dessus sont écrites avec désinvolture, veuillez les modifier vous-même

6087414@qq.comSpécifiez les paramètres

Par défaut, la fonction Si vous souhaitez saisir les valeurs des paramètres de fonction entre parenthèses ret, vous devez les saisir dans l'ordre, mais si vous spécifiez les valeurs des paramètres entre parenthèses ret, vous n'avez pas besoin de les saisir dans l'ordre.

Paramètres par défaut

Si nous définissons une valeur pour la fonction lors de la création de la fonction, le programme signalera une erreur si nous ne remplissons pas la valeur lors de l'appel de la fonction :
>>> def ret(a,b,c):
...  print(a,"a")
...  print(b,"b")
...  print(c,"c")
...
>>> ret(b="bbb",a="aaa",c="ccc")
aaa a
bbb b
ccc c
Copier après la connexion
Copier après la connexion

Si vous souhaitez résoudre ce problème, vous pouvez spécifier une valeur par défaut pour la valeur de la fonction. La valeur par défaut de la fonction spécifiée doit être spécifiée dans la ligne

. Une fois spécifiée, il n'y en a pas. vous devez entrer la valeur de la fonction lors de l'appel de cette fonction.

Si une valeur par défaut est créée pour une fonction, le paramètre avec la valeur par défaut doit être défini à la fin, pas avant la valeur sans le paramètre par défaut.
>>> def ret(x):
...  print(x)
...
>>> ret()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ret() missing 1 required positional argument: 'x'</module></stdin>
Copier après la connexion
Copier après la connexion

Paramètres dynamiquesdef

Les paramètres dynamiques traitent les paramètres réels reçus comme un tuple, et chaque paramètre est un élément du tuple.
>>> def ret(x="Hello Word"):
...  print(x)
...
>>> ret()
Hello Word
# 如果值指定默认值,那么实际参数替换掉形式参数
>>> ret("Pythoner")
Pythoner
Copier après la connexion
Copier après la connexion

Le premier paramètre dynamique

Pour définir le premier paramètre dynamique, vous devez ajouter un

chiffre devant le paramètre

Le deuxième type de paramètre dynamique

*

Pour définir le deuxième type de paramètre dynamique, vous devez ajouter deux
>>> def ret(*args):
...  print(args,type(args))
...
>>> ret(11,22,33)
(11, 22, 33) <class></class>
Copier après la connexion
Copier après la connexion
chiffres devant le paramètre. une clé correspond à une valeur, qui est tout à fait la paire clé-valeur d'un dictionnaire, et le type renvoyé est le type du dictionnaire.

Utilisez deux astérisques pour collecter les paramètres dans un dictionnaire. Le nom du paramètre est la clé du dictionnaire et la valeur du paramètre correspondant est la valeur du dictionnaire.

*Le troisième type de paramètre dynamique

Le troisième type est également appelé paramètre dynamique universel, comme indiqué ci-dessous :
>>> def ret(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> ret(k1=123,k2=456)
{'k1': 123, 'k2': 456} <class></class>
Copier après la connexion
Copier après la connexion

Dictionnaire Petit exemple :

Éviter la modification des paramètres variables

>>> def ret(*args,**kwargs):
...  print(args,type(args))
...  print(kwargs,type(kwargs))
...
>>> ret(11,222,333,k1=111,k2=222)
(11, 222, 333) <class>
{'k1': 111, 'k2': 222} <class></class></class>
Copier après la connexion
Copier après la connexion
Si vous ne souhaitez pas modifier la valeur du paramètre à l'intérieur de la fonction et affecter la valeur de l'objet externe, nous pouvons utiliser le découpage pour passer les paramètres :

>>> def arg(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> dic = {"k1":123,"k2":456}
>>> arg(k1=dic)
{'k1': {'k1': 123, 'k2': 456}} <class>
>>> arg(**dic)
{'k1': 123, 'k2': 456} <class></class></class>
Copier après la connexion
Copier après la connexion
Déballage des paramètres

ou utiliser

#!/use/bin/env python

L = ['a', 'b']
def changer(L):
    L[0] = 0
print(L)
changer(L)
"""
['a', 'b']
[0, 'b']
"""
# changer(L[:])
"""
['a', 'b']
['a', 'b']
"""
print(L)
Copier après la connexion
Copier après la connexion

position d'écriture du paramètre

In [2]: def f(a, b, c, d): print(a, b, c, d)

In [3]: args = (1, 2)

In [4]: args += (3, 4)

In [5]: f(*args)
1 2 3 4
Copier après la connexion
Copier après la connexion

dans appel de fonction :

Paramètres de position--》Paramètres de mots-clés--》Forme Tuple--》Forme Dictionnaire
def f(a, b, c, d): print(a, b, c, d)
args = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
f(**args)
Copier après la connexion
Copier après la connexion

Dans l'en-tête de la fonction :

Paramètres généraux--》Paramètres par défaut--》Forme Tuple - -》Forme de dictionnaire

Variables globales et variables locales
Compréhension simple des variables globales et des variables Les variables globales peuvent être comprises comme des variables définies dans le fichier actuel, et les variables locales le sont. sont des variables définies dans la fonction, comme dans l'exemple suivant :

def func(name, age=None, *args, **kwargs):
    print(name, age, args, kwargs)

func('ansheng', 18, *(1, 2, 3), **{'blog': 'blog.ansheng.me'})
Copier après la connexion
Copier après la connexion
Résultats de sortie Les variables globales définies par

peuvent être appelées dans la fonction, mais ne peuvent pas être modifiées dans la fonction. Les variables locales ne peuvent pas être appelées directement. Si vous souhaitez modifier des variables globales dans une fonction, vous devez utiliser le mot-clé ``

# qa
# 全局变量
n1 = 1
def num():
    # 局部变量
    n2 = 2
    print(n1)
    print(n2)
num()
Copier après la connexion
Copier après la connexion

Résultat de l'exécution

C:\Python35\python.exe F:/Python_code/sublime/Day05/def.py
1
2
Copier après la connexion
Copier après la connexion

instruction non locale.

n1 = 1
def num():
    n2 = 2
    global n1
    n1 = 3
    print(n1)
    print(n2)
num()
Copier après la connexion
Copier après la connexion

est utilisé pour modifier les variables dans les scopes imbriqués. Semblable à

, il vous suffit de déclarer le nom de la variable dans la fonction imbriquée, mais ce nom de variable doit déjà exister, sinon une erreur sera générée. signalée. Si la variable à modifier est introuvable dans la portée, la recherche ne se poursuivra pas dans la portée globale ou intégrée.
C:\Python35\python.exe F:/Python_code/sublime/Day05/def.py
3
2
Copier après la connexion
Copier après la connexion

Expressions Lambda

nonlocalLes expressions Lambda (expressions Lambda) sont des fonctions anonymes créées avec le mot-clé lambda. Les fonctions Lambda peuvent être utilisées partout où un objet fonction est requis, syntaxiquement, elles sont limitées à. n'ayant qu'une seule expression. global

Utilisez
In [1]: def func1(arg1):
   ...:     n = arg1
   ...:     print(n)
   ...:     def func2():
   ...:         nonlocal n
   ...:         n += 1
   ...:     func2()
   ...:     print(n)
   ...:     

In [2]: func1(10)
10
11
Copier après la connexion
Copier après la connexion
expression pour créer une fonction

Utilisez def pour créer une fonction

>>> def f(x,y):
...  return x + y
...
>>> f(1,2)
3
Copier après la connexion
Copier après la connexion

对于比较简单的函数我们就可以通过lambda来创建,它的的好处是缩短行数。

lambda创建的函数和def创建的函数对应关系如图所示:

Fonctions de la série Python Full Stack Road

嵌套lambda和作用域

def action(x):
    return (lambda y: x + y)

act = action(99)
print(act)
result = act(2)
print(result)
Copier après la connexion
Copier après la connexion

输出为:

<function>.<lambda> at 0x1021e6400>
101</lambda></function>
Copier après la connexion
Copier après la connexion

lambda也能够获取到任意上层lambda中的变量名:

action = lambda x: (lambda y: x + y)
act = action(99)
print(act)
result = act(3)
print(result)
Copier après la connexion
Copier après la connexion

输出为:

<function>.<locals>.<lambda> at 0x1029e6400>
102</lambda></locals></function>
Copier après la connexion
Copier après la connexion

测试题

第一题

简述普通参数、指定参数、默认参数、动态参数的区别

普通参数即是用户在调用函数是填入的参数,且参数位置必须与参数保持一致。

指定参数即在用户调用函数的时候不需要按照函数中参数的位置中所填写,指定参数是需要制定参数对应的值。

默认参数可以写在定义参数的后面,如果用户调用函数是没有制定参数,那么就会用默认参数,如果用户指定了参数,那么用户指定的参数就会代替默认参数。

动态参数可以接受用户输入的任何参数,包括字典、列表、元组等数据类型。

第二题

计算传入字符串中数字、字母、空格以及其他的个数

def var(s):
    all_num = 0
    spance_num = 0
    digit_num = 0
    others_num = 0
    for i in s:
        # 检测数字
        if i.isdigit():
            digit_num += 1
        # 检测空格
        elif i.isspace():
            spance_num += 1
        # 检测字母
        elif i.isalpha():
            all_num += 1
        else:
            # 其他
            others_num += 1
    return ("字母:",all_num,"空格:",spance_num,"数字",digit_num,"其他字符",others_num)
num = var("21323 asd*%^*^% &*213asdasdasda sdasdasd")
print(num)
Copier après la connexion
Copier après la connexion

执行结果

C:\Python35\python.exe F:/Python_code/sublime/operation/Day05/c.py
('字母:', 21, '空格:', 3, '数字', 8, '其他字符', 8)
Copier après la connexion
Copier après la connexion

第三题

写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5,如果大于5就返回True,如果小于5就返回False

# 定义一个函数num
def num(x):
    # 判断函数的值如果长度大于5就返回True
    if len(x) > 5:
        return True
    # 否则就返回False
    else:
        return False

ret = num(["asd","asdasd","asdasd","asdasd"])
print(ret)
ret = num("asdasdasd")
print(ret)
Copier après la connexion
Copier après la connexion

第四题

写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容,如果有空就返回False

# 定义一个函数num
def num(x):
    # 循环输出num内的所有内容
    for n in x:
        # 数据类型转换为字符串
        n = str(n)
        # 如果有空格就返回False
        if n.isspace():
            return False

ret = num(" ")
print(ret)

ret = num("asdasd")
print(ret)

ret = num(["asd","312",123," "])
print(ret)
Copier après la connexion
Copier après la connexion

第五题

写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

def num(x):
    # 如果列表中的长度大于2,那么就输出列表前两个内容,否则就返回一个空
    if len(x) > 2:
        return x[:2]
    else:
        return ""
print(num(["11","22","33"]))

print(num(["33"]))
Copier après la connexion
Copier après la connexion

第六题

写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

def num(x):
    # 定义一个空列表用于接收奇数位的元素
    resule = []
    # 循环输出列表中的所有元素值
    for n in range(len(x)):
        # 如果列表中的位置为奇数就把值添加到resule列表中
        if n % 2 == 1:
            resule.append(x[n])
    # 然会resule列表中的内容
    return resule

ret = num([11,22,33,44,55,66])
print(ret)
Copier après la connexion
Copier après la connexion

第七题

写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

dic = {"k1": "v1v1", "k2": [1111,22,33,44]}
Copier après la connexion
Copier après la connexion

PS:字典中的value只能是字符串或列表

代码

def dictt(x):
    # 循环字典中所有的key
    for k in x.keys():
        # 如果字典中k对应的元素是字符串类型就下面的判断
        if type(x[k]) == str:
            # 如果元素的长度大于2
            if len(x[k]) > 2:
                # 那么就让这个元素重新赋值,新的值只保留原来值的前两个
                x[k]=x[k][0:2]
        # 如果字典中k对应的元素类型是列表,就进入下面的判断
        elif type(x[k]) == list:
            # 先把列表中的值全部for循环
            for i in x[k]:
                # 把元素转换为字符串
                string = str(i)
                # 如果元素的长度大于2
                if len(string) > 2:
                    # 获取元素的索引值
                    num = x[k].index(i)
                    # 先把这个元素给删除
                    x[k].pop(x[k].index(i))
                    # 然后再添加一个新的元素,新元素的只保留原来元素的前两个
                    x[k].insert(num,string[:2])
    # 把结果return出来
    return dic
ret = dictt(dic)
print(ret)
Copier après la connexion
Copier après la connexion
  • 执行结果

C:\Python35\python.exe F:/Python_code/sublime/operation/Day05/h.py
{'k1': 'v1', 'k2': ['11', 22, 33, 44]}
Copier après la connexion
Copier après la connexion

原文链接

函数

函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。

  1. 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

  2. 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

函数式编程最重要的是增强代码的重用性和可读性

创建的函数语法

def 函数名(参数):
    ...
    函数体
    ...
    返回值
Copier après la connexion
Copier après la connexion

简单的实例

# x为函数的参数
>>> def num(x):
...  print(x)
...
# 123456等于x
>>> num("123456")
123456
Copier après la connexion
Copier après la connexion

函数的返回值

函数的返回值需要使用到return这个关键字,返回值主要是用来接受函数的执行结果

>>> def re():
...   if 1==1:
...     return True
...   else:
...     return False
...
>>> re()
True
Copier après la connexion
Copier après la connexion

函数return后面是什么值,re就返回什么值,如果没有指定return返回值,那么会返回一个默认的参数None

在函数中,当return执行完成之后,return后面的代码是不会被执行的

>>> def ret():
...  print("123")
...  return True
...  print("abc")
...
>>> ret()
123
True
Copier après la connexion
Copier après la connexion

位置参数

传入参数的值是按照顺序依次赋值过去的。

代码

# x==形式参数,形式参数有几个,那么实际参数就要传几个,默认参数除外
def ret(x):
    print(x)
# "Hello Word"实际参数
print(ret("Hello Word"))
Copier après la connexion
Copier après la connexion

执行结果

Hello Word
Copier après la connexion
Copier après la connexion

如图所示:
Fonctions de la série Python Full Stack Road

ret小括号内的值会被传入到函数ret里面都能做x的值,结果差不多就是print("Hello Word")

函数的普通参数实例:发送邮件

def email(mail):
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    msg = MIMEText('邮件内容', 'plain', 'utf-8')
    msg['From'] = formataddr(["测试",'asdasd@126.com'])
    msg['To'] = formataddr(["走人",'asdasdasd@163.com'])
    msg['Subject'] = "主题"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("wdfgfghfgh@126.com", "123456")
    server.sendmail('asdasdas@126.com', [mail,], msg.as_string())
    server.quit()

email("6087414@qq.com")
Copier après la connexion
Copier après la connexion

当执行这个脚本的时候会给邮箱6087414@qq.com发送邮件。

注:上面的邮箱地址等都是随便写的,请自行更改

指定参数

>>> def ret(a,b,c):
...  print(a,"a")
...  print(b,"b")
...  print(c,"c")
...
>>> ret(b="bbb",a="aaa",c="ccc")
aaa a
bbb b
ccc c
Copier après la connexion
Copier après la connexion

默认情况在再函数ret括号内如果要输入函数参数的值,是要按照顺序来的,但是如果在ret括号内制定的参数的值,那么就不需要按照顺序来了。

默认参数

如果我们在创建函数的时候给函数定义了值,那么在调用函数的时候如果不填写值程序就会报错:

>>> def ret(x):
...  print(x)
...
>>> ret()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ret() missing 1 required positional argument: 'x'</module></stdin>
Copier après la connexion
Copier après la connexion

如果要解决这个问题就可以给函数的值指定一个默认值,指定函数的默认值需要在def这一行指定,制定之后,当调用这个函数的时候就不需要输入函数值了。

>>> def ret(x="Hello Word"):
...  print(x)
...
>>> ret()
Hello Word
# 如果值指定默认值,那么实际参数替换掉形式参数
>>> ret("Pythoner")
Pythoner
Copier après la connexion
Copier après la connexion

如果给函数创建了默认值,那么有默认值的这个参数必须在最后面定义,不能够在没有默认参数的值的前面。

动态参数

动态参数把接收过来的实际参数当作一个元组,每一个参数都是元组中的一个元素。

第一种动态参数

定义第一种动态参数需要在参数前面加上一个*

>>> def ret(*args):
...  print(args,type(args))
...
>>> ret(11,22,33)
(11, 22, 33) <class></class>
Copier après la connexion
Copier après la connexion

第二种动态参数

定义第二种动态参数需要在参数前面加上两个*号,给参数传参的时候是一个key对应一个value的,相当于一个字典的键值对,而且返回的类型就是字典类型。

使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值。

>>> def ret(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> ret(k1=123,k2=456)
{'k1': 123, 'k2': 456} <class></class>
Copier après la connexion
Copier après la connexion

第三种动态参数

第三种又称为万能的动态参数,如下实例:

>>> def ret(*args,**kwargs):
...  print(args,type(args))
...  print(kwargs,type(kwargs))
...
>>> ret(11,222,333,k1=111,k2=222)
(11, 222, 333) <class>
{'k1': 111, 'k2': 222} <class></class></class>
Copier après la connexion
Copier après la connexion

字典小例子:

>>> def arg(**kwargs):
...  print(kwargs,type(kwargs))
...
>>> dic = {"k1":123,"k2":456}
>>> arg(k1=dic)
{'k1': {'k1': 123, 'k2': 456}} <class>
>>> arg(**dic)
{'k1': 123, 'k2': 456} <class></class></class>
Copier après la connexion
Copier après la connexion

避免可变参数的修改

如果不想在函数内部修改参数值而影响到外部对象的值,我们可以使用切片的方式进行参数的传递:

#!/use/bin/env python

L = ['a', 'b']
def changer(L):
    L[0] = 0
print(L)
changer(L)
"""
['a', 'b']
[0, 'b']
"""
# changer(L[:])
"""
['a', 'b']
['a', 'b']
"""
print(L)
Copier après la connexion
Copier après la connexion

参数解包

In [2]: def f(a, b, c, d): print(a, b, c, d)

In [3]: args = (1, 2)

In [4]: args += (3, 4)

In [5]: f(*args)
1 2 3 4
Copier après la connexion
Copier après la connexion

又或者使用

def f(a, b, c, d): print(a, b, c, d)
args = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
f(**args)
Copier après la connexion
Copier après la connexion

参数书写位置

在函数调用中: 位置参数 --》 关键字参数 --》元组形式--》字典形式
在函数头部: 一般参数--》默认参数--》元组形式--》字典形式

def func(name, age=None, *args, **kwargs):
    print(name, age, args, kwargs)

func('ansheng', 18, *(1, 2, 3), **{'blog': 'blog.ansheng.me'})
Copier après la connexion
Copier après la connexion

全局变量和局部变量

简单的理解全局变量和变量,全局变量可以理解为在当前这个文件内定义的变量,局部变量则是在函数内定义的变量,如下例:

# qa
# 全局变量
n1 = 1
def num():
    # 局部变量
    n2 = 2
    print(n1)
    print(n2)
num()
Copier après la connexion
Copier après la connexion

输出的结果

C:\Python35\python.exe F:/Python_code/sublime/Day05/def.py
1
2
Copier après la connexion
Copier après la connexion

定义的全局变量都可以在函数内调用,但是不能再函数内修改,局部变量在也不能够直接调用,如果要在函数内修改全局变量,那么就需要用到关键字``

n1 = 1
def num():
    n2 = 2
    global n1
    n1 = 3
    print(n1)
    print(n2)
num()
Copier après la connexion
Copier après la connexion

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Day05/def.py
3
2
Copier après la connexion
Copier après la connexion

nonlocal语句

nonlocal是用来修改嵌套作用域中的变量,类似于global一样,只需要在嵌套函数中声明变量名即可,但是这个变量名是必须已经存在的否则就会报错,如果要修改的变量在作用域中查找不到,那么不会继续到全局或内置作用域中查找。

In [1]: def func1(arg1):
   ...:     n = arg1
   ...:     print(n)
   ...:     def func2():
   ...:         nonlocal n
   ...:         n += 1
   ...:     func2()
   ...:     print(n)
   ...:     

In [2]: func1(10)
10
11
Copier après la connexion
Copier après la connexion

Lambda表达式

Lambda(Lambda expressions)表达式是用lambda关键字创建的匿名函数,Lambda函数可以用于任何需要函数对象的地方,在语法上,它们被局限于只能有一个单独的表达式。

使用Lambda表达式创建函数

>>> f = lambda x,y : x + y
>>> f(1,2)
3
Copier après la connexion

使用def创建函数

>>> def f(x,y):
...  return x + y
...
>>> f(1,2)
3
Copier après la connexion
Copier après la connexion

对于比较简单的函数我们就可以通过lambda来创建,它的的好处是缩短行数。

lambda创建的函数和def创建的函数对应关系如图所示:

Fonctions de la série Python Full Stack Road

嵌套lambda和作用域

def action(x):
    return (lambda y: x + y)

act = action(99)
print(act)
result = act(2)
print(result)
Copier après la connexion
Copier après la connexion

输出为:

<function>.<lambda> at 0x1021e6400>
101</lambda></function>
Copier après la connexion
Copier après la connexion

lambda也能够获取到任意上层lambda中的变量名:

action = lambda x: (lambda y: x + y)
act = action(99)
print(act)
result = act(3)
print(result)
Copier après la connexion
Copier après la connexion

输出为:

<function>.<locals>.<lambda> at 0x1029e6400>
102</lambda></locals></function>
Copier après la connexion
Copier après la connexion

测试题

第一题

简述普通参数、指定参数、默认参数、动态参数的区别

普通参数即是用户在调用函数是填入的参数,且参数位置必须与参数保持一致。

指定参数即在用户调用函数的时候不需要按照函数中参数的位置中所填写,指定参数是需要制定参数对应的值。

默认参数可以写在定义参数的后面,如果用户调用函数是没有制定参数,那么就会用默认参数,如果用户指定了参数,那么用户指定的参数就会代替默认参数。

动态参数可以接受用户输入的任何参数,包括字典、列表、元组等数据类型。

第二题

计算传入字符串中数字、字母、空格以及其他的个数

def var(s):
    all_num = 0
    spance_num = 0
    digit_num = 0
    others_num = 0
    for i in s:
        # 检测数字
        if i.isdigit():
            digit_num += 1
        # 检测空格
        elif i.isspace():
            spance_num += 1
        # 检测字母
        elif i.isalpha():
            all_num += 1
        else:
            # 其他
            others_num += 1
    return ("字母:",all_num,"空格:",spance_num,"数字",digit_num,"其他字符",others_num)
num = var("21323 asd*%^*^% &*213asdasdasda sdasdasd")
print(num)
Copier après la connexion
Copier après la connexion

执行结果

C:\Python35\python.exe F:/Python_code/sublime/operation/Day05/c.py
('字母:', 21, '空格:', 3, '数字', 8, '其他字符', 8)
Copier après la connexion
Copier après la connexion

第三题

写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5,如果大于5就返回True,如果小于5就返回False

# 定义一个函数num
def num(x):
    # 判断函数的值如果长度大于5就返回True
    if len(x) > 5:
        return True
    # 否则就返回False
    else:
        return False

ret = num(["asd","asdasd","asdasd","asdasd"])
print(ret)
ret = num("asdasdasd")
print(ret)
Copier après la connexion
Copier après la connexion

第四题

写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容,如果有空就返回False

# 定义一个函数num
def num(x):
    # 循环输出num内的所有内容
    for n in x:
        # 数据类型转换为字符串
        n = str(n)
        # 如果有空格就返回False
        if n.isspace():
            return False

ret = num(" ")
print(ret)

ret = num("asdasd")
print(ret)

ret = num(["asd","312",123," "])
print(ret)
Copier après la connexion
Copier après la connexion

第五题

写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

def num(x):
    # 如果列表中的长度大于2,那么就输出列表前两个内容,否则就返回一个空
    if len(x) > 2:
        return x[:2]
    else:
        return ""
print(num(["11","22","33"]))

print(num(["33"]))
Copier après la connexion
Copier après la connexion

第六题

写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

def num(x):
    # 定义一个空列表用于接收奇数位的元素
    resule = []
    # 循环输出列表中的所有元素值
    for n in range(len(x)):
        # 如果列表中的位置为奇数就把值添加到resule列表中
        if n % 2 == 1:
            resule.append(x[n])
    # 然会resule列表中的内容
    return resule

ret = num([11,22,33,44,55,66])
print(ret)
Copier après la connexion
Copier après la connexion

第七题

写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

dic = {"k1": "v1v1", "k2": [1111,22,33,44]}
Copier après la connexion
Copier après la connexion

PS:字典中的value只能是字符串或列表

代码

def dictt(x):
    # 循环字典中所有的key
    for k in x.keys():
        # 如果字典中k对应的元素是字符串类型就下面的判断
        if type(x[k]) == str:
            # 如果元素的长度大于2
            if len(x[k]) > 2:
                # 那么就让这个元素重新赋值,新的值只保留原来值的前两个
                x[k]=x[k][0:2]
        # 如果字典中k对应的元素类型是列表,就进入下面的判断
        elif type(x[k]) == list:
            # 先把列表中的值全部for循环
            for i in x[k]:
                # 把元素转换为字符串
                string = str(i)
                # 如果元素的长度大于2
                if len(string) > 2:
                    # 获取元素的索引值
                    num = x[k].index(i)
                    # 先把这个元素给删除
                    x[k].pop(x[k].index(i))
                    # 然后再添加一个新的元素,新元素的只保留原来元素的前两个
                    x[k].insert(num,string[:2])
    # 把结果return出来
    return dic
ret = dictt(dic)
print(ret)
Copier après la connexion
Copier après la connexion
  • 执行结果

C:\Python35\python.exe F:/Python_code/sublime/operation/Day05/h.py
{'k1': 'v1', 'k2': ['11', 22, 33, 44]}
Copier après la connexion
Copier après la connexion

更多Fonctions de la série Python Full Stack Road之路系列之函数相关文章请关注PHP中文网!

Étiquettes associées:
source:php.cn
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