初学python(对比java语言不同) 第五篇
来源:互联网 发布:yii2.0框架 商城源码 编辑:程序博客网 时间:2024/05/21 14:49
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 89fib不是一个函数,而是一个过程(子程序),因为它并不返回任何值。事实上,没有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 函数
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 = 5def f(arg=i): print argi = 6f()
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 LimburgerIt's very runny, sir.It's really very, VERY runny, sir.----------------------------------------client : John Cleeseshopkeeper : Michael Palinsketch : Cheese Shop Sketch3任意参数列表,一个最不常用的场景是让函数可以被可变个数的参数调用。这些参数被放在一个元组中。在可变个数的参数之前,可以有零到多个普通的参数。
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)436文档字符串
>>> 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.
- 初学python(对比java语言不同) 第五篇
- 初学python(对比java语言不同) 第二篇
- 初学python(对比java语言不同) 第三篇
- 初学python(对比java语言不同) 第四篇
- 初学python(对比java语言不同) 第六篇
- 初学python(对比java语言不同) 第七篇
- 初学python(对比java语言不同) 第八篇
- 初学python(对比java语言不同) 第九篇
- 初学python(对比java语言不同) 第十篇
- 初学python(对比java语言不同) 第一篇
- 初学python(对比java语言不同) 第十一篇
- Python和Java语言对比
- 初学Python-第五章练习题
- ORACLE初学第五篇
- C#/C++/Java/Python语言不同手册
- python--对比两个Excel不同
- 初学java:Java面向对象与c语言面向过程的不同
- 初学Java语言
- 获取视频封面,本地视频,网络视频都可以用
- Attempt to present VC whose view is not in the window hierarchy 解决
- java多线程之FutureTask
- Android源码解析之(十一)-->应用进程启动流程
- win7系统注册组件失败
- 初学python(对比java语言不同) 第五篇
- 安卓中序列化Serializable和Parcelable区别和使用,intent间传递
- bootstrap实现pause/play键切换
- Redis 快速入门
- OpenStack Heat software config and software deployment code anlysis
- Glide用在CircleImageView上每次进入第一次显示默认图片
- 【剑指offer系列】 二叉树的深度___39
- 学习感悟
- git:Please enter a commit message to explain why this merge is necessary