Python学习日记2(函数和模块)

学习历程按照Github上jackfrued的100天学习python的进度来进行,再辅上一些自己查找的相关资料。
对应传送门:https://github.com/jackfrued/Python-100-Days/tree/master/

Day05 构造程序逻辑

1.在python中,/代表浮点数除法,//代表整数除法
2.python求幂方法:(1) math模块中的pow函数 (2) 使用**运算符(*为乘法,**为乘方)
"*"和"**"的其它定义:https://blog.csdn.net/liuxingen/article/details/50113923 (Python的星号(*、**)的作用)

Day06 函数和模块的使用

1.python没有函数重载的功能
2.python使用关键字def来定义函数,例子

def factorial(num):
    """
    求阶乘
    :param num: 非负整数
    :return: num的阶乘
    """
    result = 1
    for n in range(1, num + 1):
        result *= n
    return result

(注:python中自带的求阶乘friction函数在math模块内)

  1. python函数的参数可以有默认值,当调用该函数的时候如果没有传入对应参数的话会直接使用参数的默认值。例子:
from random import randint

def roll_dice(n=2):
    """
    摇色子
    
    :param n: 色子的个数
    :return: n颗色子点数之和
    """
    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))
  1. 当函数的参数不确定时,可以采用可变参数*args,可变参数*args相当于一个元组,具体例子:
def add(*args):
    total = 0
    for val in args:
        total += val
    return total

print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
  1. 如果在同一个.py文件中定义了两个同名函数的话,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。为了避免这一状况,我们可以在不同模块中定义它们。(Python中每个文件就代表了一个模块(module))在使用函数的时候我们通过import关键字导入指定的模块就可以区分到底要使用的是哪个模块中的foo函数,代码如下所示。

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()

也可以按照如下所示的方式来区分到底要使用哪一个foo函数。

test.py

import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

6.当导入的模块中有可执行代码的时候,python会执行对应的代码,所以为了避免这种情况,可以对里面的可执行代码放入模块判断的条件中,只有当该模块为主运行模块的时候才会进行运行。
__name__是Python中一个隐含的变量它代表了模块的名字
只有被Python解释器直接执行的模块的名字才是__main__
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__
  1. Python的函数里面可以再定义函数
  2. 为了减少全局变量的使用(global全局变量使用过多可能会发生意料之外的修改和使用以及可能导致对象占用的内存长时间无法被垃圾回收),降低代码之间的耦合度,这就意味着应该尽量让变量的作用域在函数的内部,因此主函数可以按照下面方法进行书写:
def main():
    # Todo: Add your code here
    pass


if __name__ == '__main__':
    main()
  1. python中的变量作用域:Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索
def foo():
    b = 'hello'

    def bar():  # Python中可以在函数内部再定义函数
        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()

在上述代码中,对bar函数而言,a为全局作用域,b为嵌套作用域,c为局部作用域。
(对应链接:https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/06.%E5%87%BD%E6%95%B0%E5%92%8C%E6%A8%A1%E5%9D%97%E7%9A%84%E4%BD%BF%E7%94%A8.md)

你可能感兴趣的:(Python学习日记2(函数和模块))