(四)Python面试之 您所在的位置:网站首页 goto函数python作用 (四)Python面试之

(四)Python面试之

2023-04-13 04:59| 来源: 网络整理| 查看: 265

关于Python函数理解较为简单,下面只介绍几个特殊的知识点;

一、查看函数基本信息

python与ipython中输入help(func);

In [1]: help(sum)二、可变参数与不可变参数传入

python中不能说像C++中为值传递还是引用传递,我们应该说传不可变对象(数值、字符串、tuple)和传可变对象(字典、列表、集合);

2.1 传入不可变对象

以下变量y指向数值对象1,传入函数add中,新建变量x,也指向数值对象1,由于数值运算不可变,当进行赋值或者运算时,会创建了新的对象,此时x指向了运算后新的对象,函数返回后,变量y依然指向原来的内存对象,所以y依然等于1;

In [12]: def add(x): ...: print(id(x)) ...: x = 2 ...: print(id(x)) In [13]: y = 1 In [14]: add(y) 94598244276928 94598244276960 #id发生了改变 In [15]: y Out[15]: 1

2.1 传入可变对象

如下所示,传入变量y指向可变对象,x赋值指向该对象,可变对象所指内存中的值可以被改变,也没有开辟新的地址,所以此时x[0]+=1变成了2,x指向还是该内存,返回时y[0]变为了2;

In [5]: def add(x): ...: x[0] += 1 In [6]: y = [1,2,3] In [7]: id(y) Out[7]: 139667642729352 In [8]: add(y) In [9]: id(y) Out[9]: 139667642729352 In [10]: y Out[10]: [2, 2, 3]三、变量作用域

变量又分为局部变量与全局变量;全局变量在函数内部无法直接修改;

In [19]: x = 1 ...: def outer(): ...: x = 2 ...: print('local:', x) ...: outer() ...: print('global:', x) local: 2 global: 1

但是可以在函数内部通过global关键字修饰后,对全局变量进行更改;

In [20]: x = 1 ...: def outer(): ...: global x ...: x = 2 ...: print('local:', x) ...: outer() ...: print('global:', x) local: 2 global: 2

(局部变量)定义在函数内部的变量拥有局部作用域,(全局变量)定义在函数外的拥有全局作用域,全局变量全局变量可以在整个程序范围内访问;这样就会影响到函数嵌套定义,看下一节。

In [21]: x = 1 ...: def outer(): ...: print('local:', x) #全局变量作用整个程序范围,包括函数内部 ...: outer() ...: print('global', x) local: 1 global 1 四、函数嵌套定义

利用上述全局变量的作用域,在函数嵌套调用中,func函数调用sum与sub函数,直接可以如下表示:

In [22]: def func(): ...: x = 1 ...: y = 2 ...: def sum(): #嵌套函数,引用外部变量 ...: return x + y ...: def sub(): #嵌套函数,引用外部变量 ...: return x - y ...: return sum() * sub() ...: print(func()) -3

一般函数嵌套,可以将被调用的函数写在函数内部;

In [23]: def func(): ...: x = 1 ...: y = 2 ...: def sum(x, y): #嵌套函数 ...: return x + y ...: def sub(x, y): #嵌套函数 ...: return x - y ...: return sum(x, y) * sub(x, y) ...: print(func()) -3

但不建议上述两种方式的函数嵌套写法,不方便维护,且容易造成逻辑混乱,尤其是引用外部变量的方式。

五、匿名函数lambda

lambda用于创建匿名函数,主体是一个表达式,仅能封装有限的逻辑进去,复杂的逻辑块不适用于lambda函数;

5.1 lambda基本使用如下

#最常使用形式 赋值给一个变量add,变量即可作为函数使用,lambda 变量:表达式 In [1]: add = lambda x, y: x+y In [2]: add(1, 2) Out[2]: 3 #传入多个输入参数,通过位置参数*args或关键字参数**kwargs,上一节*号使用就介绍过 In [16]: maxf = lambda *args:max(args) In [17]: maxf(1,2,3,4) Out[17]: 4 #无输入参数,返回值固定值 In [23]: maxf = lambda :1 In [24]: maxf() Out[24]: 1

5.2 lambda高阶用法:

1、map() 函数:map() 会根据提供的函数对指定序列作映射,python2.x返回新的值或新的列表,python3.x会返回一个迭代器。

map(function, iterable, ...)

In [36]: list(map(lambda x:x**2, [1, 2, 3, 4])) #list将迭代器生成序列 Out[36]: [1, 4, 9, 16]

2、reduce() 函数:reduce() 对参数序列中的参数进行累计进行相关操作(比如累计乘)。函数将一个数据集合、列表,元组等中的所有数据进行累计操作,最后得到一个结果。举例如下:

reduce(function, iterable, ...)

In [42]: from functools import reduce In [43]: reduce(lambda x,y:x*y, [1, 2, 3, 4]) #对输入元素进行累计相乘操作 Out[43]: 24 In [44]: reduce(lambda x,y:x+y, [1, 2, 3, 4]) #对输入元素进行累计相加操作 Out[44]: 10总结:

1、注意函数传入参数是可变与不可变对象,其返回参数值是否变化本质是由于id改变;

2、全局变量在整个程序起作用,局部变量仅在当前函数内部;如在函数内部修改全局变量,需要通过global声明;

3、复杂的逻辑块不适应于lambda函数,lambda与map函数结合能对单个值或多个元素作映射,与reduce函数结合能对单个值或多个元素进行累计操作(累计乘或加);



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有