Python学习日志1——函数(初学者最需掌握的函数知识)

本文介绍了Python中函数的定义、作为一级对象的特性,包括函数可以被赋值给变量、作为参数、存储在数据结构中以及作为返回值。还讨论了lambda表达式(匿名函数)的使用,并展示了链式调用和在函数中如何调用全局变量的例子。
摘要由CSDN通过智能技术生成


前言

以下内容为作者在日常学习过程当中的学习记录,大家可以参考,若有错误之处请联系作者修改,大家共同学习,一起进步。


提示:以下是本篇文章正文内容,下面案例可供参考,本文中会将部分程序的运行结果以“==>”的形式给出,方便大家理解

一、函数的定义

  • 以def关键词开头,后接函数标识符名称和圆括号();
  • 圆括号之中可以用以定义参数;
  • 函数中的第一行语句可以使用适当的文本字符串对函数作以说明;
  • return 表达式结束函数内容并返回一个值给调用方,若没有return或者是不带表达式的return将会返回None(注意None不属于任何一种数据类型);
  • Python的函数的返回值可以是多个对象,这是由于隐式元组的机制。
import math
def circle(r):
    return 2*math.pi*r,math.pi*r*r
print(circle(3))    ==>(18.84955592153876, 28.274333882308138)

二、函数是一级对象

函数与其他基本数据类型(int、float、string、list、tuple、dict)具有同等的地位,所以函数可以:

  • 将函数赋值给变量;
  • 作为其他函数的参数;
  • 存储在其他数据类型(如 dicts)中;
  • 作为其他函数的返回值。

1.将函数赋值给变量

代码如下(示例):

def print_self():
    return "abc"
a = print_self     ##注意此处不能写print_self(),这个表示函数的返回值
print(a())     ==>abc

语句 a = print_self 将函数 print_self 所引用的对象赋值给变量 a

2.函数作为另一函数的参数

  1. 一级抽象(一般来讲是对数值进行抽象):

代码如下(示例):

def test1 (List_of_items):     ###此处List_of_items是一个列表
    for item in List_of_items:
        print(item)

这是一级抽象,将数值进行了抽象。

  1. 二级抽象(可以对动作进行抽象):

代码如下(示例):

def test2 (List_of_items,object_func()):   ###此处test2的两个参数,第一个为一个列表,第二个为一个函数(注意此函数并未给出具体定义,仅作参考)
    for item in List_of_items:
        object_func(item)

在第三行的代码中调用了函数,这可能看起来微不足道,但实际上这一“简单”的行为已经将抽象的级别提高了一级,由此可以想象这一功能的强大。

3.其他数据结构内的函数

我们已经在前文提到了函数作为一级对象是与其他的基本数据类型具有同等的地位的,所以“顺理成章”地,它自然可以存储在其他的数据类型当中。

代码如下(示例):

def add (x,y):
    return x+y
def sub (x,y):
    return x-y
def mult (x,y):
    return x*y

x=int(input('Input a number in 1,2,3')

map_test={1:add,2:sub,3:mult}
print(map_test[x])                   ==> <function add at 0x0000019EDFED1550>(当输入‘1’时)
print(map_test[x](3,5))              ==> 83 + 5

同时函数也可以存在于比较复杂的表达式中(我们可以将上方倒数三行的代码进行整合(这里就不单独体现倒数第二行代码的作用了,大家理解就好)):
代码如下(示例):

print(add if x==1 else sub if x==2 else mult)(3,5)

4.作为其他函数的返回值

代码如下(示例):

def add (x,y):
    return x+y
def sub (x,y):
    return x-y
def mult (x,y):
    return x*y


def test3 (x):
    if x==1 :
        return add
    elif x==2 :
        return sub
    else :
        return mult
my_test=test3(2)
print(my_test(2,3))           ==> -1
my_test=test3(9)
print(my_test(2,3))           ==> 6     

在这里我们不妨观察一下两个print的语句是完全一样的,但是最后的输出结果是不同的,这就与它们的执行行为有很大的关系了。

三、lambda表达式(匿名函数)

lambda表达式也就是匿名函数具有一些普通函数没有的优点:

  • 某处需要一个函数,但是并不需要专门定义;
  • 函数只用一次,如果为此专门去定义一个函数会造成代码的冗余;
  • 一次性,命名无所谓。

注意:

  • 如果函数体较为复杂,不建议使用lambda表达式;
  • lambda表达式不用写return;
  • lambda表达式必须一行写完。

代码示例:

test = map (lambda i:i*i,[y for y in range(5)])
print (list(test))                                  ==> [0, 1, 4, 9, 16]

下面我们来介绍一个lambda表达式常用的地方,就是对一个字典变量排序时,设置排序的关键字。
一般默认按照键来排序,下面这个示例我们设置它按照值来排序。
代码示例:

test_dict={add:3,sub:2,mult:1}
print(sorted(test_dict.items(),key= lambda item:item[1]))   ==>[(<function mult at 0x0000019EDFED1C10>, 1), (<function sub at 0x0000019EDFED1430>, 2), (<function add at 0x0000019EDFED1B80>, 3)]

按键:lambda item: item[0]
按值:lambda item: item[1]
按照键长度:lambda item: len ( item[0] )
·······

四、链式调用

如果一个函数的返回值是一个对象,那么我们就可以继续调用对象所拥有的成员函数,从而形成链式调用函数。
代码示例:

test_str='I love you'
print(test_str.replace('I','She').replace('you','me'))     ==> She love me

五、在函数中调用全局变量

我们知道:在函数内的变量,我们称作局部变量,函数外的变量,称作全局变量。而且我们是无法直接在函数内对全局变量做修改的,如果需要在函数内对全局变量做修改,我们需要使用关键字 global 进行声明,下面我们来看一个例子:
代码示例:

a,b=10,20
def test_4 (m):
    a=m
    global b
    b+=m
test_4(100)
print(a,b)            ==> 10 120

在上述代码示例中,a,b均为全局变量,在调用完 test_4(100) 这一行代码之后,按道理来讲a,b的值均会被修改,但从输出的结果来看,a没有被修改,b被修改了。这就是因为在函数体中只有b用global进行了声明,所以便修改了全局变量b。至于a,由于并未声明,所以其实在函数体中的a是一个新建的局部变量,不过重名了而已。

总结

以上就是本文的全部内容,本文仅仅是一位初学者对所学函数的基本知识的一个总结和梳理,很多地方都是未经精雕细琢,难免有无,还望见谅,那么如果你想要更深一步地学习函数的相关知识不妨可以登录Python官网(知识链接(Python官网)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值