Python——函数基础

函数基础

  • 函数就是将一些语句集合在一起的部件,不止一次地在程序中运行。还能计算出一个返回值,并能够改变作为函数输入的参数。

编写函数

函数基础

  • def是可执行的代码,Python函数时由def编写的,def是一个可执行的语句,函数并不存在。直到Python运行了def后才存在。
  • def创建了一个对象并将其赋值给某一变量名。当Python运行到def语句时,将会生成一个新的函数对象并将其赋值给这个函数名。就像所有的赋值一样,函数名变成了某一个函数的引用。
  • return将一个结果对象发送给调用者,当函数被调用时,其调用者停止运行直到这个函数完成了工作,之后函数将控制权返回调用者,return返回值就是函数调用的结果
  • yield向调用者返回一个结果对象
    global声明了一个模块级的变量并被赋值,在默认情况下,所有在一个函数中被赋值的对象,是这个函数的本地变量,并且仅在这个函数运行的过程中存在。为了分配一个可以在整个模块中都可以使用的变量名,函数需要在global语句中将它列举出来。变量名需要关注它的作用域,并且是通过赋值语句将变量名绑定至作用域的
  • nonlocal声明了将要赋值的一个封闭的函数变量。在Python3中添加的nonlocal语句允许一个函数来赋值一条语法封闭的def语句的作用域中已有的名称。允许封闭的函数作为保留状态的地方
  • 函数时通过对象引用传递的,在Python中,参数通过赋值传递给函数。
  • 参数、返回值以及变量并不是声明,在函数中并没有类型约束。可以传递任意类型的参数给函数。函数也可以返回任意类型的对象

def语句

格式

def将创建一个函数对象并将其赋值给一个变量名

def <name>(arg1,arg2,....argn):
      <statements>
  • def包含了首行并有一个代码块跟随在后边,这个代码块通常会缩进。这个代码块就是Python函数的执行语句
  • def的首行定义了函数名,赋值给了函数对象,并在括号中包含了0个或多个参数。在函数调用的时候,在首行的参数名称赋值给了括号中传递来的对象
  • 带返回值的格式
def <name>(arg1,arg2,....argN):
  statement
return <value>
  • return语句可以在函数主体中任何地方出现,表示函数调用的结束。并将结果返回至调用处。
  • 定义的函数中,如果没有return,会默认return null
  • 如果在函数中return多个对象,Python会将多个对象封装为一个元组返回,其实返回的还是一个对象

def是实时执行的

  • Python的def语句实际上是一个可执行的语句:当运行时,创建一个新的函数对象并将其赋值给一个变量名,Python中的所有语句都是实时运行的,没有独立编译这样的流程。所以def语句可以出现在任一地方。还可以嵌套在其他的语句中
if test:
  def func():
      statement
else:
  def func()
      statment
statement
func()
  • def在运行时简单地给一个变量名进行赋值,Python函数在程序运行之前并不需要全部定义。
  • 函数的函数名并不重要,可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用。
  • 函数允许任意的属性附加到记录信息供随后使用
def func():....
func()
func.attr = value
示例
# 返回两个数的计算结果
>>> def times(x,y):
...     return x*y
... 
>>> time = time(2,3)
>>> time = times(2,3)
>>> time
6
  • 函数中的参数完全取决于参数的对象类型

用户定义的函数属性

用户定义的函数具有以下属性

  • f.doc 文档字符串
  • f.name 函数名称
  • f.dict 包含函数属性的字典
  • f.code 字节编译的代码
  • f.defaults 包含默认参数的元组
  • f.globals 定义全局命名空间的字典
  • f.closure 包含与嵌套作用域相关数据的元组

Python中的多态

同样的函数,在不同的实例下执行的结果取决于不同的实例。这种依赖行为称为多态。

  • 作为函数,可以自动的适用于所有类别的对象类型。只要对象支持所预期的接口,函数就能处理
  • Python中代码不应该关心特定的数据类型。
# 寻找序列的交集
>>> def intersect(seq1,seq2):
...     res=[]
...     for x in seq1:
...             if x in seq2:
...                     res.append(x)
...     return res
... 
>>> x = [1,2,3,4,5]
>>> y = ['a',1,2,'b','c',4]
>>> resout = intersect(x,y)
>>> resout
[1, 2, 4]
  • 如果我们传入了不支持这些接口的对象,Python将会自动检测出不匹配,并抛出一个异常
本地变量

在上述的代码中res是本地变量,这个变量只是在def内的函数中是可见的,并且仅在函数运行时是存在。所有的在函数内部进行赋值的变量名都默认为本地变量。

  • 参数也是通过赋值被传入的,所以seq1和seq2是本地变量
  • for循环将元素赋值给了变量X,所以变量X是本地变量
  • 所有的本地变量都会在函数调用时出现,并在函数退出时消失。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容