初学python(对比java语言不同) 第五篇

版权声明: https://blog.csdn.net/xclltssun/article/details/51119335

Python定义函数

关键字def引入函数的定义。其后必须跟有函数名和以括号标明的形式参数列表。组成函数体的语句从下一行开始,且必须缩进。

函数体的第一行可以是一个可选的字符串文本;此字符串是该函数的文档字符串,或称为docstring。

执行一个函数会引入一个用于函数的局部变量的新符号表。更确切地说,函数中的所有的赋值都是将值存储在局部符号表;而变量引用首先查找局部符号表,然后是上层函数的局部符号表,然后是全局符号表,最后是内置名字表。因此,在函数内部全局变量不能直接赋值(除非在一个global语句中命名),虽然可以引用它们。

函数调用的实际参数在函数被调用时引入被调函数的局部符号表;因此,参数的传递使用传值调用(这里的值始终是对象的引用,不是对象的值)。一个函数调用另一个函数时,会为该调用创建一个新的局部符号表。
函数定义会在当前符号表内引入函数名。函数名对应值的类型是解释器可识别的用户自定义函数。此值可以分配给另一个名称,然后也可作为函数。这是通用的重命名机制:

>>> def fib(n): 
...     a, b = 0, 1
...     while a < n:
...         print a,
...         a, b = b, a+b
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
fib不是一个函数,而是一个过程(子程序),因为它并不返回任何值。事实上,没有return语句的函数也返回一个值,尽管是一个很无聊的值。此值被称为None(它是一个内置的名称)。如果 None只是唯一的输出,解释器通常不会打印出来。

下面写一个带return的例子

>>> def fib2(n):
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # see below
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # call it
>>> f100                # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Java 函数

扫描二维码关注公众号,回复: 3062389 查看本文章

Java有构造函数和调用函数2种,

构造函数,在创建对象时候使用。(其实在C里还有析构函数,在销毁对象时候调用)

调用函数,在创建对象后,才能使用调用函数。

他们使用几乎类似,python更简洁,不需要java的private/public,也不需要返回viod/其他类型,而且传参也很随意。

顺便提一下 java 的void虽然没有返回值,但是和python一样,内部其实return null



Python 函数深入学习

1 默认参数值 最有用的形式是指定一个或多个参数的默认值。这种方法创建的函数被调用时,可以带有比定义的要少的参数。

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    pass
这个函数可以通过几种方式调用:
只给出强制参数: ask_ok ('Do you really want to quit?')
给出一个可选的参数: ask_ok ('OK to overwrite the file?', 2)

或者ask_ok ('OK to overwrite the file?',complaint='lalala'

给出所有的参数: ask_ok ('OK to overwrite the file?', 2, 'Come on, only yes or no!')

如果指定了参数名字,那么顺序就不重要了

ask_ok (prompt='OK to overwrite the file?',complaint='Come on, only yes or no!', retries=2)

或者ask_ok (retries=2, prompt='OK to overwrite the file?', complaint='Come on, only yes or no!')

或者不给参数,默认值在定义域中的函数定义的时候计算

i = 5
def f(arg=i):
    print arg
i = 6
f()

2当最后一个形参以**name形式出现时,它接收一个字典,该字典包含了所有未出现在形式参数列表中的关键字参数。它还可能与*name形式的参数组合使用,*name接收一个包含所有没有出现在形式参数列表中的位置参数元组。(*name必须出现在**name之前。)例如,如果我们定义这样的函数:


def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]
然后这样调用

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")
打印结果

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
3任意参数列表,一个最不常用的场景是让函数可以被可变个数的参数调用。这些参数被放在一个元组中。在可变个数的参数之前,可以有零到多个普通的参数。

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))
4参数列表的分拆,当传递的参数已经是一个列表或元组时,情况与之前相反,你要分拆这些参数,因为函数调用要求独立的位置参数。例如,内置的range()函数期望单独的start和stop参数。如果它们不是独立的,函数调用时使用 *-操作符将参数从列表或元组中分拆开来:

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]
以同样的方式,可以用**-操作符让字典传递关键字参数:

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)

5 lambda表达式,可以使用lambda关键字创建小的匿名函数。Lambda 函数可以用于任何需要函数对象的地方。在语法上,它们被局限于只能有一个单独的表达式。在语义上,他们只是普通函数定义的语法。像嵌套的函数定义,lambda 函数可以从包含范围引用变量:

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
6文档字符串

>>> def my_function():
...     """Do nothing, but document it.
...
...     No, really, it doesn't do anything.
...     """
...     pass
...
>>> print my_function.__doc__
Do nothing, but document it.
    No, really, it doesn't do anything.




猜你喜欢

转载自blog.csdn.net/xclltssun/article/details/51119335
今日推荐