声明与定义比较

本文详细介绍了Python中声明与定义的区别,强调Python将两者视为一体。探讨了前向引用的限制,函数属性的使用,包括内部和内嵌函数的概念。深入讲解了函数应用,如打印图形、数学计算以及递归和高阶函数,如lambda表达式、filter、map、reduce和apply。同时,阐述了变量作用域,包括全局变量和局部变量的使用,以及如何通过global语句操作全局变量。最后,举例说明了可变类型全局变量的特性。
摘要由CSDN通过智能技术生成

声明与定义比较

​ 在某些编程语言里, 函数声明和函数定义区分开的。一个函数声明包括提供对函数名,参数的名字(传统上还有参数的类型), 但不必给出函数的任何代码, 具体的代码通常属于函数定义的范畴。

​ 在声明和定义有区别的语言中, 往往是因为函数的定义可能和其声明放在不同的文件中。 python将这两者视为一体,函数的子句由声明的标题行以及随后的定义体组成的。

前向引用

和其他高级语言类似,Python 也不允许在函数未声明之前,对其进行引用或者调用.

我们下面给出几个例子来看一下:

 def foo():
...     print("in foo()")
...     bar()
...
>>> def bar():
...     print("in bar()")

结果:

 foo()
in foo()
in bar()

函数属性

你可以获得每个Python模块,类,和函数中任意的名字空间。你可以在模块foo和bar里都有名为x的一个变量,但是在将这两个模块导入你的程序后,仍然可以使用这两个变量,所以,即使在两个模块中使用了相同的变量名字,这也是安全的,因为句点属性标识对于两个模块意味了不同命名空间,比如说这段代码,在这段代码中没有名字冲突:

import foo,bar
    print(foo.x+bar.x)

函数属性是Python另外一个使用了句点属性标识并拥有名字空间的领域

def foo():
...     'fo() -- properly created doc string'
...
>>> def bar():
...     pass
...
>>> bar._doc_ = 'Oops,forgot the doc str above'
>>> bar.version = 0.1

上面的foo()中,我们以常规的方式创建了我们的文档字串,比如,在函数声明后一个没有赋值的字串。当声明bar()时,我们什么都没做,仅用了句点属性标识来增加文档字串以及其他属性。我们可以接着任意地访问属性,下面是一个使用了交互解释器的例子(你可能已经发现,用内建函数help()显示会比用_doc_属性更漂亮,但是你可以选择你喜欢的方式)

help(foo)
Help on function foo in module __main__:

foo()
    fo() -- properly created doc string

>>> bar.version
0.1

bar._doc_
'Oops,forgot the doc str above'

注意我们是如何在函数声明外定义一个文档字串。然而我们仍然可以就像平常一样,在运行时刻访问它。然而你不能在函数的声明中访问属性。换句话说,在函数声明中没有’self‘这样的东西让你可以进行诸如__dict__[‘version’] = 0.1 的赋值。这是因为函数体还没有被创建,但之后你有了函数对象,就可以按我们在上面描述的那样方法来访问它的字典。另外一个自由的名字空间!

内部、内嵌函数

在函数体内创建另外一个函数(对象)是完全合法的。这种函数叫做内部、内嵌函数

最明显的创造内部函数的方法是在外部函数的定义体内定义函数(用def关键字),如在:


内部函数一个有趣的方面在于整个函数体都在外部函数的作用域(即是你可以访问一个对象的区域;稍后会有更多关于作用域的介绍)之内。如果没有任何对 bar()的外部引用,那么除了在函数体内,任何地方都不能对其进行调用,这就是在上述代码执行到最后你看到异常的原因

另外一个函数体内创建函数对象的方式是使用lambda 语句。 稍后讲述。如果内部函数的定义包含了在外部函数里定义的对象的引用(这个对象甚至可以是在外部函数之外),内部函数会变成被称为闭包(closure)的特别之物。

函数应用:打印图形和数学计算

函数的嵌套调用:

程序设计的思路,复杂问题分解为简单问题。

  • 思考1:编程实现

    • 写一个函数打印一条横线
    • 打印自定义函数的横线
  • 参考代码

 def line():
...     print("-"*15)
def printOneLine():
    print("-"*30)
    
#打印多行横线
def printSumLine(n):
     for i in sum(n):
  • 求三个数的和

    • 参考代码&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值