DAY 03 Python函数

Python入门函数(上)

  1. 简介

  2. 函数

    1. 函数的定义

    2. 函数的调用

    3. 函数文档

    4. 函数参数

    5. 函数的返回值

    6. 变量作用域

  3. Lambda-表达式

    1. 匿名函数的定义

    2. 匿名函数的应用

  4. 类与对象

    1. 属性和方法组成对象

    2. self是什么?

    3. Python的魔法方法

    4. 公有和私有

    5. 继承

    6. 组合

    7. 类、类对象和实例对象

    8. 什么是绑定?

    9. 一些相关的内置函数(BIF)

  5. 魔法方法

    1. 基本的魔法方法

    2. 算术运算符

    3. 反算术运算符

    4. 增量赋值运算

    5. 一元运算符

    6. 属性访问

    7. 描述符

    8. 定制序列

    9. 迭代器

函数

函数的定义

还记得 Python 里面“万物皆对象”么?Python 把函数也当成对象,可以从另一个函数中返回出来而去构建高阶函数,比如:
参数是函数、返回值是函数。

我们首先来介绍函数的定义。

  • 函数以def关键词开头,后接函数名和圆括号()。
  • 函数执行的代码以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None

def functionname (parameters):

       “函数_文档字符串”

        function_suite

        return [expression]

函数的调用

函数文档

函数参数

Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态如下:

  • 位置参数 (positional argument)
  • 默认参数 (default argument)
  • 可变参数 (variable argument)
  • 关键字参数 (keyword argument)
  • 命名关键字参数 (name keyword argument)
  • 参数组合

1. 位置参数

def functionname(arg1):

       “函数_文档字符串”

       function_suite

       return [expression]

  • arg1 - 位置参数 ,这些参数在调用函数 (call function) 时位置要固定。

2. 默认参数

def functionname(arg1, arg2=v):

       “函数_文档字符串”

       function_suite

       return [expression]

  • arg2 = v - 默认参数 = 默认值,调用函数时,默认参数的值如果没有传入,则被认为是默认值。

  • 默认参数一定要放在位置参数 后面,不然程序会报错。

  • Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

3. 可变参数

顾名思义,可变参数就是传入的参数个数是可变的,可以是 0, 1, 2 到任意个,是不定长的参数。

def functionname(arg1, arg2=v, *args):

       “函数_文档字符串”

       function_suite

       return [expression]

  • *args - 可变参数,可以是从零个到任意个,自动组装成元组。
  • 加了星号(*)的变量名会存放所有未命名的变量参数。

4. 关键字参数

def functionname(arg1, arg2=v, *args, **kw):

       “函数_文档字符串”

       function_suite

       return [expression]

  • **kw - 关键字参数,可以是从零个到任意个,自动组装成字典。

「可变参数」和「关键字参数」的同异总结如下:

  • 可变参数允许传入零个到任意个参数,它们在函数调用时自动组装为一个元组 (tuple)。
  • 关键字参数允许传入零个到任意个参数,它们在函数内部自动组装为一个字典 (dict)。

5. 命名关键字参数

def functionname(arg1, arg2=v, *args, *, nkw, **kw):

       “函数_文档字符串”

       function_suite

       return [expression]

  • *, nkw - 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 *

  • 如果要限制关键字参数的名字,就可以用「命名关键字参数」

  • 使用命名关键字参数时,要特别注意不能缺少参数名。

  • 没有写参数名nwk,因此 10 被当成「位置参数」,而原函数只有 1 个位置函数,现在调用了 2 个,因此程序会报错。

6. 参数组合

在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:

  • 位置参数、默认参数、可变参数和关键字参数。
  • 位置参数、默认参数、命名关键字参数和关键字参数。

要注意定义可变参数和关键字参数的语法:

  • *args 是可变参数,args 接收的是一个 tuple
  • **kw 是关键字参数,kw 接收的是一个 dict

命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名关键字参数不要忘了写分隔符 *,否则定义的是位置参数。

警告:虽然可以组合多达 5 种参数,但不要同时使用太多的组合,否则函数很难懂。

函数的返回值

变量作用域

  • Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

  • 定义在函数内部的变量拥有局部作用域,该变量称为局部变量。

  • 定义在函数外部的变量拥有全局作用域,该变量称为全局变量。

  • 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

  • 当内部作用域想修改外部作用域的变量时,就要用到globalnonlocal关键字了。

内嵌函数

def outer():
    print('outer函数在这被调用')

    def inner():
        print('inner函数在这被调用')

    inner()  # 该函数只能在outer函数内部被调用


outer()
# outer函数在这被调用
# inner函数在这被调用
outer函数在这被调用
inner函数在这被调用

闭包

  • 是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
  • 如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
  • 通过闭包可以访问外层非全局作用域的变量,这个作用域称为 闭包作用域
def funX(x):
    def funY(y):
        return x * y

    return funY


i = funX(8)
print(type(i))  # <class 'function'>
print(i(5))  # 40
<class 'function'>
40

【例子】闭包的返回值通常是函数。

def make_counter(init):
    counter = [init]

    def inc(): counter[0] += 1

    def dec(): counter[0] -= 1

    def get(): return counter[0]

    def reset(): counter[0] = init

    return inc, dec, get, reset


inc, dec, get, reset = make_counter(0)
inc()
inc()
inc()
print(get())  # 3
dec()
print(get())  # 2
reset()
print(get())  # 0
3
2
0

【例子】 如果要修改闭包作用域中的变量则需要 nonlocal 关键字

def outer():
    num = 10

    def inner():
        nonlocal num  # nonlocal关键字声明
        num = 100
        print(num)

    inner()
    print(num)


outer()

# 100
# 100
100
100

递归

  • 如果一个函数在内部调用自身本身,这个函数就是递归函数。

【例子】设置递归的层数,Python默认递归层数为 100

import sys

sys.setrecursionlimit(1000)

Lambda 表达式

匿名函数的定义

在 Python 里有两类函数:

  • 第一类:用 def 关键词定义的正规函数
  • 第二类:用 lambda 关键词定义的匿名函数

Python 使用 lambda 关键词来创建匿名函数,而非def关键词,它没有函数名,其语法结构如下:

lambda argument_list: expression

  • lambda - 定义匿名函数的关键词。
  • argument_list - 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。
  • :- 冒号,在函数参数和表达式中间要加个冒号。
  • expression - 只是一个表达式,输入函数参数,输出一些值。

注意:

  • expression 中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。
  • 匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

匿名函数的应用

函数式编程 是指代码中每一块都是不可变的,都由纯函数的形式组成。这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出,没有任何副作用。

匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中,主要有两种形式:

  • 参数是函数 (filter, map)
  • 返回值是函数 (closure)

如,在 filtermap函数中的应用:

  • filter(function, iterable) 过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

  • map(function, *iterables) 根据提供的函数对指定序列做映射。

除了 Python 这些内置函数,我们也可以自己定义高阶函数。

【例子】

def apply_to_list(fun, some_list):
    return fun(some_list)

lst = [1, 2, 3, 4, 5]
print(apply_to_list(sum, lst))
# 15

print(apply_to_list(len, lst))
# 5

print(apply_to_list(lambda x: sum(x) / len(x), lst))
# 3.0
15
5
3.0

类与对象

对象 = 属性 + 方法

对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。

  • 封装:信息隐蔽技术

我们可以使用关键字 class 定义 Python 类,关键字后面紧跟类的名称、分号和类的实现。

  • 继承:子类自动共享父类之间数据和方法的机制

  • 多态:不同对象对同一方法响应不同的行动


self 是什么?

Python 的 self 相当于 C++ 的 this 指针。

类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self。在调用方法时,我们无需明确提供与参数 self 相对应的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python函数split是用来将一个字符串按照指定的分隔符进行分割的函数。根据提供的引用内容,可以得出以下结论: 引用中的代码示例展示了split函数在情况一下的使用。在这个情况下,字符串s是"an apple a day",split函数的参数是'a',它会将字符串s按照'a'进行分割,并返回分割后的部分。在这个例子中,返回的结果是['', 'n ', 'pple ', ' d', 'y']。 引用中的代码示例展示了split函数在情况三下的使用。在这个情况下,字符串s是"an apple||a day",split函数的参数是'||',它会将字符串s按照'||'进行分割,并返回分割后的部分。在这个例子中,返回的结果是['an apple', 'a day']。 引用中的代码示例展示了split函数在情况二下的使用。在这个情况下,字符串s是"an apple a day",split函数的参数是''(空字符串),它会将字符串s按照空格进行分割,并返回分割后的部分。在这个例子中,返回的结果是['an', 'apple', 'a', 'day']。 综上所述,根据不同的情况和参数,Python函数split可以按照指定的分隔符将字符串进行分割,并返回分割后的部分。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python中split函数](https://blog.csdn.net/u014125025/article/details/100639792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值