Python函数基础知多少

函数基础

简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用。

有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验)。我们可以把相同的代码提炼出来做成一个函数,在需要的地方只需要调用即可。那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了。

函数在Python中是最基本的程序结构,用来最大化地让我们的代码进行复用;与此同时,函数可以把一个错综复杂的系统分割为可管理的多个部分,简化编程、代码复用。

接下来我们看看什么是函数,及函数该如何定义。有两种方式可以进行函数的定义,分别是deflambda关键字。

函数定义

先总结一下为什么要使用函数?

  1. 代码复用最大化及最小化冗余代码;
  2. 过程分解(拆解)。把一个复杂的任务拆解为多个小任务。

函数定义的语法为(使用def关键字创建了一个函数对象,并把该对象赋值给了一个函数名称。):

def func_name(arg1, arg2, arg3, ..., argN):
    statement
    return value

根据上面定义,可以简单地描述为:Python中的函数是具有0个或多个参数,具有若干行语句并且具有返回值(返回值可有可无)的一个语句块(注意缩进)。

那么我们就定义一个比较简单的函数,该函数没有参数,进入ipython交互式环境:

In[1]: def hello():
  ...:    print('Leave me alone, the world')
  ...:

def语句定义了一个函数,但是并不会调用该函数。我们在代码中可以调用已定义的函数,在函数的名称后面加上一对小括号就可以调用,小括号中还有可选的函数参数。接下来调用(执行)该函数。

In[2]: hello()
Leave me alone, the world

我们发现hello()函数并没有return语句,在Python中,如果没有显式的执行return语句,那么函数的返回值默认为None

我们说过,定义函数有两种形式,另外一种形式是使用lambda来定义。使用lambda定义的函数是匿名函数,这个我们在后面的内容进行讲解,这里暂且不表。

接下来我们看看一个带参数的函数定义及调用:

>>> def intersect(seq1, seq2):
...    res = []
...    for x in seq1:
...        if x in seq2:
...            res.append(x)
...    return res
... 
>>> s1 = 'SPAM'
>>> s2 = 'SCAM'
>>> intersect(s1, s2)
['S', 'A', 'M']

这个例子主要作用是:传入两个列表,求它们的共同的元素。当我们调用该函数时,需要给此函数传入两个参数。这里我们把s1传递给了函数体中的seq1,把s2传递给了seq2,然后把返回值res返回给调用者。上面的演示中我们并没有接收该函数的返回值,如果在后面的代码中需要用到该函数的返回值,那么可以把该函数的返回值赋值给一个变量即可。如:

>>> result = intersect(s1, s2)
>>> result
['S', 'A', 'M']

针对上面的例子,可以使用前面文章中介绍过的列表推导式:

>>> [x for x in s1 if x in s2]
['S', 'A', 'M']

函数实战

函数基础就介绍到这里,接下来上一个实际的小示例,通过requests库查询手机号的归属地信息。如果系统没有安装requests包,使用pipeasy_install进行安装:

pip install requests

代码为(在ipython交互式环境中执行的该代码):

In[1]: import requests

In[2]: def phone():
   ...:     num = input('Enter your phone number>>> ')
   ...:     api = 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel='
   ...:     r = requests.get(api + num.strip())
   ...:     if r.ok:
   ...:         print(r.text)
   ...:     r.close()
   ...:     return None
   ...: 

In[3]: phone()
Enter your phone number>>> 13651813235
__GetZoneResult_ = {
    mts:'1365181',
    province:'上海',
    catName:'中国移动',
    telString:'13651813235',
areaVid:'29423',
ispVid:'3236139',
carrier:'上海移动'
}

上面示例中的函数并没有接收参数,接下来把该函数改造为带参数的。代码为:

In[4]: def phone(phone_num):
   ...:     api = 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel='
   ...:     res = requests.get(api+phone_num)
   ...:     if res.ok:
   ...:         print(res.text)
   ...:     res.close()
   ...:     return None
   ...: 

In[5]: phone('13651813235')
__GetZoneResult_ = {
    mts:'1365181',
    province:'上海',
    catName:'中国移动',
    telString:'13651813235',
areaVid:'29423',
ispVid:'3236139',
carrier:'上海移动'
}

估计大家会对requests库的使用比较陌生,关于requests的使用,其官方网站有详细的介绍,大家可以看一看如何使用,比标准库的urllib模块要好用一些。

原文发布于微信公众号 - 小白的技术客栈(XBDJSKZ)

原文发表时间:2017-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25410
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2892
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4074
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2727
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2626
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5377
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5656
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3919
来自专栏魂祭心

原 canvas绘制clock

4244

扫码关注云+社区