python函数

函数根据有没有参数,有没有返回值,可以相互组合,一共有4种

  • 无参数,无返回值

  • 无参数,有返回值

  • 有参数,无返回值

  • 有参数,有返回值

  • 函数嵌套

  • 封装 - 数据隐藏

    可以使用内层函数来保护它们不受函数外部变化的影响,也就是说把它们从全局作用域隐藏起来。

    来看一个简单的例子 - 求一个数字 n 的倍数:

     

    >>> def outer(n):
    ...     def inner_multiple(n):  # 从外部代码隐藏
    ...         return n * 2
    ...     num = inner_multiple(n)
    ...     print(num)
    ... 
    >>>1234567

    尝试调用 inner_multiple(n) 会引发错误:

     

    >>> outer(5)
    10
    >>> 
    >>> inner_multiple(5)  # 外部无法访问
    ...
    NameError: name 'inner_multiple' is not defined123456

    这是因为它被定义在 outer() 的内部,被隐藏了起来,所以外部无法访问。

    在 Python 递归函数 一节中,分享过一个关于阶乘的递归实现,但是存在一个问题 - 没有做容错处理。

    下面来利用嵌套函数,对递归做一个更好的实现:

     

    >>> def factorial(n):
    ...
    ...     # 错误处理
    ...     if not isinstance(n, int):  # 仅限整形
    ...         raise TypeError("Sorry. 'n' must be an integer.")
    ...     if n < 0:  # 仅限 0 和 正数
    ...         raise ValueError("Sorry. 'n' must be zero or positive.")
    ...     
    ...     def inner_factorial(n):
    ...         if n <= 1:
    ...             return 1
    ...         return n * inner_factorial(n - 1)
    ...     return inner_factorial(n)
    ... 
    >>> 123456789101112131415

    这样以来,程序就会变得更加健壮,当数据类型或值不合理时,便会引发错误:

     

    >>> factorial('Py')  # 类型错误
    ...
    TypeError: Sorry. 'n' must be an integer.
    >>> 
    >>> factorial(-10)  # 值错误
    ...
    ValueError: Sorry. 'n' must be zero or positive.
    >>> 
    >>> factorial(5)  # OK
    12012345678910

    使用这种模式的主要优势在于:利用外部函数执行所有的参数检查,便可以在内部函数中跳过错误检查,并安全放心地进行使用

     

     

     

    >>> def print_file(f):
    ...     for line in f:
    ...         print(line)
    ... 
    >>> f = open('data.txt', 'r')
    >>> print_file(f) 
    Hi, all

    I am a Pythonista

    >>> 1234567891011

    支持文件名:

    >>> def print_file_content(file_name):
    ...     if isinstance(file_name, str):
    ...         with open(file_name, 'r') as f:
    ...             for line in f:
    ...                 print(line)
    ... 
    >>> print_file_content('data.txt')
    Hi, all

    I am a Pythonista

    >>> 123456789101112

    很显然,有很多代码可以复用,通过嵌套函数来实现:

    >>> def print_file(file):
    ...     def inner_print(file_process):
    ...         for line in file_process:
    ...             print(line, end = '')
    ...     
    ...     if isinstance(file, str):
    ...         with open(file, 'r') as f:
    ...             inner_print(f)
    ...     else:
    ...         inner_print(file)
    ... 
    >>>
    --------------------- 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值