Python100Days notas de estudio --- funciones y módulos de uso Day6

Antes de explicar el contenido de este capítulo, vamos a examinar un problema de matemáticas, por ejemplo la siguiente ecuación ¿Cuántas soluciones enteras positivas.

X 1 + X 2 + X 3 + X 4 = 8 x_1 + x_2 + x_3 + x_4 = 8

De hecho, el problema anterior es equivalente a 8 divididos en cuatro grupos de Apple Apple al menos un número de tipos de programas. Pensar en esta pregunta la respuesta es bastante clara.

Aquí Insertar imagen Descripción
El programa puede ser utilizado para calcular el valor de Python, como se muestra en el siguiente código.

"""
输入M和N计算C(M,N)

Version: 0.1
Author: 骆昊
"""

m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
    fm *= num
fn = 1
for num in range(1, n + 1):
    fn *= num
fmn = 1
for num in range(1, m - n + 1):
    fmn *= num
print(fm // fn // fmn)

devuelve la función
no saben si se dio cuenta, en el código anterior, hacemos tres veces factorial, este código es en realidad código duplicado. El maestro programador Sr. Martin Fowler dijo una vez: "Hay muchos códigos de mal gusto, la repetición es la peor clase!", Para escribir código de alta calidad primer problema que hay que resolver es repetir el código. Para los códigos anteriores, podemos calcular la llamada a la función factorial encapsulado en una módulos de "función" de función, donde es necesario el cálculo factorial, sólo tenemos que la "función" de "llamada" en él.

funciones definidas
se pueden utilizar en Python definición de palabras clave para definir las funciones y variables, ya que cada función también tiene un nombre famoso, pero nombrando a los convenios de denominación de variables son consistentes. Se puede pasar entre paréntesis después del nombre de la función colocado a los parámetros de función, función y matemáticas en esto es muy similar en los parámetros de función del programa es equivalente a decir el argumento de una función matemática, y la ejecución de la función es completa que podamos por palabra clave return para devolver un valor, lo que equivale a decir que las funciones matemáticas variables dependientes.

En la comprensión de cómo definir una función, podemos llevar a cabo la reconstrucción del código anterior, la llamada reconstrucción es sin efecto sobre la estructura del código para ajustar la premisa del resultado de la ejecución de código, el código después de la reconstrucción se muestra a continuación.

def factorial(num):
    """求阶乘"""
    result = 1
    for n in range(1, num + 1):
        result *= n
    return result


m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(factorial(m) // factorial(n) // factorial(m - n))

Descripción : módulo matemático de Python es ya una función factorial, de hecho, se puede utilizar directamente para calcular la función factorial sin que esto ya hecho su propia definición. Los siguientes ejemplos son algunas de las funciones en Python también están fácilmente disponibles, estamos aquí para explicar la definición y el uso de la función y sólo entonces se dieron cuenta de nuevo, no se recomienda el desarrollo real de hacerlo bajo nivel de trabajo repetitivo.

parámetros de la función
función es un código que la gran mayoría de los lenguajes de programación son compatibles con los "bloques de construcción", pero la función de Python con otras funciones del lenguaje no es el mismo todavía hay muchos lugares donde una diferencia significativa es para Python el procesamiento de los parámetros de función. En Python, los parámetros de función pueden tener valores predeterminados, sino que también apoya el uso de parámetros variables, por lo que Python no tiene por qué ser igual que otros idiomas admiten la sobrecarga de funciones, ya que podemos hacerlo en una variedad de diferentes definiciones de una función del tiempo uso, los siguientes son ejemplos de dos pequeños.

from random import randint


def roll_dice(n=2):
    """摇色子"""
    total = 0
    for _ in range(n):
        total += randint(1, 6)
    return total


def add(a=0, b=0, c=0):
    """三个数相加"""
    return a + b + c


# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))

Damos dos funciones por encima de los parámetros tienen los valores por defecto, lo que significa que si se utiliza el valor predeterminado para este parámetro si el valor del parámetro correspondiente no hay funciones de llamada entrante, por lo que en el código anterior se pueden usar una variedad de maneras diferentes para agregar llamadas de función, que al igual que muchos otros idiomas función de efecto de sobrecarga es el mismo.

De hecho, la función de complemento anteriormente, así como una mejor aplicación, ya que podrían tener cero o más parámetros de víbora, y en concreto el número de parámetros se determina por la persona que llama, que funcionará como un diseñador de este punto no saber nada, tan incierto cuando el número de parámetros, se puede utilizar un parámetro variable, el código que se muestra a continuación.

# 在参数名前面的*表示args是一个可变参数
def add(*args):
    total = 0
    for val in args:
        total += val
    return total


# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))

módulo de gestión con funciones
para cualquier lenguaje de programación, a las variables, funciones tales identificadores de los nombres son un problema molesto, porque vamos a encontrar este conflicto de nombres situación incómoda. El caso más simple es la definición de las dos funciones del mismo nombre en el mismo archivo .py, ya que Python no tiene un concepto de sobrecarga de funciones, a continuación, antes de la última definición cubrirá la definición, significa que las dos funciones son en realidad una función del mismo nombre solamente uno está presente.

def foo():
    print('hello, world!')


def foo():
    print('goodbye, world!')


# 下面的代码会输出什么呢?
foo()

Por supuesto, el caso anterior que puede ser fácilmente evitado, pero si es el momento de llevar a cabo el proyecto desarrollado por un equipo de más de colaboración, el equipo puede tener más de programador define una función denominada foo, entonces cómo resolver este nombramiento conflicto que? La respuesta es muy simple, Python cada archivo representa un módulo (módulo), podemos tener una función con el mismo nombre en diferentes módulos, al utilizar la función importamos por palabra clave import módulo especificado se puede distinguir en el extremo los cuales módulo utilizando la función foo, las miradas código como.

module1.py

def foo():
    print('hello, world!')

module2.py

def foo():
    print('goodbye, world!')

test.py

from module1 import foo

# 输出hello, world!
foo()

from module2 import foo

# 输出goodbye, world!
foo()

Manner se puede distinguir como se muestra en el uso final para el que una función foo.

test.py

import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

Sin embargo, si el código se escribe de la siguiente manera, el programa se llama en la última importación foo, debido a que el foo foo importación que se han importado anteriormente.

test.py

from module1 import foo
from module2 import foo

# 输出goodbye, world!
foo()

test.py

from module2 import foo
from module1 import foo

# 输出hello, world!
foo()

Cabe señalar que, si importamos el módulo, además de la definición de la función también se puede ejecutar código en allí, entonces el intérprete de Python ejecutará el código cuando se importa el módulo, de hecho, es posible que no espero, por lo que si la ejecución de los módulos de código escritos, es preferible para ejecutar este código en la condición como se muestra a continuación, por lo menos ejecutar directamente el módulo, si no se ejecutará el código en condiciones, a causa del módulo de ejecución directa solamente nombre es el " principal ".

module3.py

def foo():
    pass


def bar():
    pass


# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
    print('call foo()')
    foo()
    print('call bar()')
    bar()

test.py

import module3

# 导入module3时 不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__

Aquí Insertar imagen Descripción

Aquí Insertar imagen Descripción

Aquí Insertar imagen Descripción

Aquí Insertar imagen Descripción

Nota: Se puede ver por los procedimientos anteriores, cuando se repitió el código y la función relativamente independiente para extraer una función, podemos combinar estas funciones para resolver problemas más complejos, por lo que es necesario definir y el uso una función muy importante de la razón.

Finalmente, se discuten cuestiones relacionadas con variables de Python alcance.

def foo():
    b = 'hello'

    # Python中可以在函数内部再定义函数
    def bar():
        c = True
        print(a)
        print(b)
        print(c)

    bar()
    # print(c)  # NameError: name 'c' is not defined


if __name__ == '__main__':
    a = 100
    # print(b)  # NameError: name 'b' is not defined
    foo()

El código anterior se puede ejecutar con éxito e imprime 100, hola y Verdadero, pero nos hemos dado cuenta, no define a y b son dos variables dentro de la barra de funciones, entonces A y B son de. Si definimos una rama en el código anterior en una variable, que es una variable global (variable global), pertenece al ámbito mundial, debido a que no se ha definido en cualquiera de una función. En lo anterior, podemos definir la variable de función foo B, que es una variable local (variable local) en la definición de función, pertenecen al ámbito local, y foo función externa no tener acceso a ella, sin embargo, la barra de funciones foo interna función, la variable b pertenece ámbitos anidados, que están en función de la barra se puede acceder a él. La variable en un bar perteneciente c ámbito local, además de la barra de funciones no es accesible. De hecho, el orden de "ámbito local", "ámbitos anidados" cuando Python busca de una variable "ámbito global" para buscar y el orden "incorporado alcance", el primero de tres que hemos visto en el código anterior a la llamada "-alcance construida" es un built-in Python esos identificadores, se utilizó previamente de entrada, imprimir, int pertenecen al ámbito incorporado.

Mira el siguiente fragmento de código, queremos modificar el valor de una variable global por una llamada a la función, pero en realidad el siguiente código no lo es.

def foo():
    a = 200
    print(a)  # 200


if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 100

Después de llamar a la función foo, todavía encontramos que el valor de un 100, esto se debe a que cuando escribimos a = 200 dentro de foo, la re-definición de un nombre para una variable local, es de alcance global no la misma variable, debido a su variable de ámbito local, y por lo tanto ya no buscar la función foo alcance global de una. Si queremos modificar el alcance global en función foo, una, el código se muestra a continuación.

def foo():
    global a
    a = 200
    print(a)  # 200


if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 200

Podemos utilizar la palabra clave global para indicar que la función de la variable foo desde un ámbito global, si no es un ámbito global, a continuación, la siguiente línea de código definirá las variables y colocar un ámbito global. Del mismo modo, si queremos que la función dentro de la función puede modificar los ámbitos anidados variables, puede utilizar la palabra clave para indicar las variables no locales de los ámbitos anidados, por favor autotest.

En el desarrollo real, hay que minimizar el uso de variables globales, modificar y utilizar inesperada debido a que el alcance y el impacto de las variables globales es demasiado amplia, se puede producir, además de una variable global tiene un largo que la variable local ciclo de vida, la memoria ocupada por objetos podría resultar en mucho tiempo no puede ser basura. De hecho, reducir el uso de variables globales, sino que también es una medida importante para reducir el grado de acoplamiento entre el código, sino también la práctica de Demeter. Reducir el uso de variables globales medios debemos tratar de hacer que el alcance de las variables dentro de una función, pero si queremos una extensión del ciclo de vida variable local, por lo que al final es la definición de una llamada de función puede seguir utilizando su valor esta vez tenemos que utilizar un cierre, que explicamos en el contenido posterior.

Descripción : Mucha gente va a menudo "cierre" y "función anónima" confundidos, pero en realidad no son la misma cosa, si se quiere entender este concepto, se puede echar un vistazo a Wikipedia o el conocimiento de las discusiones sobre el concepto de la paz .

Dijo que por lo tanto, de hecho, la conclusión es simple, podemos escribir código Python a partir de ahora en el siguiente formato, este poco de mejora en nuestra comprensión es en realidad un gran paso adelante en las funciones básicas y ámbito de aplicación.

def main():
    # Todo: Add your code here
    pass


if __name__ == '__main__':
    main()
Publicados 124 artículos originales · ganado elogios 141 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_36838630/article/details/105205932
Recomendado
Clasificación