目前不清楚函数和方法是不是一个概念,python的函数写法和java除了格式(冒号缩进这些)有区别外,定义和参数上区别很大
python中函数的概念很重要
- 函数定义
def say_hello(): # 属于该函数的语句块 print('hello world') # 函数结束 say_hello() # 调用函数
说明:使用关键字def 定义,冒号结尾,函数名均用小写字母,用下划线不要用驼峰,语句块要缩进,两个函数之间尽量空两行
- 参数
def func_name(para1, para2)
说明:形参和实参概念不变,不需要指定类型,左括号后,右括号前不要空格
- 局部变量和全局变量
x = 50 def func(x): print(x) x = 2 print( x) func(x) print(x)
输出:50,2,50
说明:局部变量作用域和java相同,只在函数内部
x = 50 def func(): global x print(x) x = 2 print(x) func() print(x)
输出:50,2,2
说明:如果想在函数内部对函数外的变量赋值,需要声明为global变量,称为全局变量或顶级变量,可同时声明多个全局变量,如global x,y,z
- 默认参数值
def say(message, times=1): print(message * times) say('Hello') say('World', 5)
说明:形参指定默认参数值时,值必须是常数;= 号前后都不要留空格;这个形参必须在未指定默认值的形参之后,错误示例:def func(a=5,b)
- 关键字参数
def func(a, b=5, c=10): print(a, b, c) func(3, 7) func(25, c=24) func(c=50, a=100)
说明:这样调用时可以不关注参数位置,而是通过参数名(关键字)指定实参
- 可变参数
def total(a=5, *numbers, **phonebook): print('a', a) # 遍历元组中的所有项 for e in numbers: print('e', e) # 遍历字典中的所有项 for first, second in phonebook.items(): print(first,second) print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
说明:
我们在java规约中,强调要避免使用可变参数
python中,当声明了带*号的参数 *param时,从这个参数开始后的所有参数都会被收集进入一个名为param的元组
当声明了带**的参数 **param时,从这个参数开始,所有参数都会被收集进入一个名为param的字典
python会自动判断值所属的类型,收集从哪个入数开始,到哪个入参结束
- return
def maximum(x, y): if x > y: return x elif x == y: return 'equal' else: return y print(maximum(2, 3))
说明:
遇到return语句,立即跳出函数;
没有返回值的语句(return)等价于return None (python中的None和java中的null的地位稍有区别);
如果函数没有return语句,系统会自己在函数结尾添加return None语句;
- pass
def func():
pass
print(func())
说明:pass表示一个空语句块,通常用于占位,上述输出结果为:None
- DocStrings
def max(x, y): '''Prints the maximum of two numbers. The two values must be integers.''' # 如果有必要,将参数转为整数 x = int(x) y = int(y) if x > y: print(x) else: print(y) print_max(3, 5) print(print_max.__doc__)
说明:DocStrings是文档字符串,各个规约中,很看中文档字符串这部分的编写,在非平凡函数(行数较多,或逻辑较复杂的)中强烈建议加上
编写规则:函数的首行首字母大写,句号结尾;第二行为空行;第三行及其以后为具体描述;前后用三引号;
通过 __doc__属性来访问函数的DocStrings,之所以说属性,前面讲了,一切皆对象,函数也是对象,对象有属性,__doc__就是函数的其中一个属性,和js相近
以上,介绍的都是函数的基本的语法和规则,具体的还需要多练