0.方法是绑定在对象的,而函数则不是。
1.什么是函数?
在程序设计中,常常将一些常用的功能模块编写成函数。函数是带有入口和出口的代码片段,用于完成特定的功能。所谓的入口,就是函数所带的各个参数;所谓出口,就是函数的返回值。我们可以把函数比作一个带入口和出口的盒子,对于盒子的使用者,我们不关系盒子内部是如何实现的,我们只关心这个盒子能做什么。
- 函数代码块以
def
关键字开头,后接函数名和圆括号()
- 圆括号之间用于定义参数;函数调用时候也需要将传入参数放置在圆括号中
- 函数的第一行语句可以选择性的使用文档字符串(
"""
)用于存放函数说明 - 函数内容以(
:
)起始,并且注意缩进。 -
return [表达式]
结束函数,选择性地返回一个值给调用方。不带表达式的return
相当于返回None
- 函数的返回值可以是多个,中间用逗号隔开,但是其实实质是返回了一个
tuple
注意:
在 python 中,类型属于对象,变量是没有类型的:
a = 100
a = "string"
- python函数的参数传递:
可更改对象与不可更改对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
- 不可变类型:变量赋值
a=5
后再赋值a=10
,这里实际是新生辰改了一个int值对象10,再让a指向它,而5被丢弃,不是改变了a的值,而是新生成了一个a。 - 可变类型:变量赋值
la = [1, 2, 3, 4]
后再赋值la[2] = 5
,则是将list la 的第三个元素值更改,本身la
没有动。只是内部的一部分值被修改了。
python函数的参数传递:
- 不可变类型:类似c++的值传递,如:整数,字符串,元组。如:
fun(a)
,传递的只是a
的值,没有影响a
对象本身。比如在fun(a)
内部修改a
的值,知识修改另外一个复制的对象,不会影响到a
本身。 - 可变类型:类似于c++,的引用传递,如:列表,字典。如:
func(la)
,则是将la
真正的传过去,修改后fun
外部的la
也会受影响。
python中一切都是对象,严格意义我们不能说值传递韩式引用传递,我们应该说传不可变对象和传可变对象。
传递不可变对象 eg:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b # 结果是 2
传递可变对象 eg:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4]);
print "函数内取值: ", mylist
return
# 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外取值: ", mylist
函数参数:
1)必备参数
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print str;
return;
#调用printme函数
printme(); # 会报错,没有传递参数
2)关键字参数:
键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print str;
return;
#调用printme函数
printme( str = "My string");
3)缺省参数
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
return;
#调用printinfo函数
printinfo( name="miki" ); # 不会报错
4)不定长参数
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
eg:
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
===
输出:
10
输出:
70
60
50
5)匿名函数
python使用lambda来创建匿名函数。
语法:
lambda [arg1 [,arg2,.....argn]]:expression
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2;
# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )
eg:
sum = lambda a, b:a+b
print sum(10, 20)
return语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None.
形参和实参
def add_num(x, y): # 这里的x, y是形参
return x + y
add_num(2, 3) # 这里的2,3是实参
- 变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪儿赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
全局变量
局部变量
total = 0; # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
#返回2个参数的和."
total = arg1 + arg2; # total在这里是局部变量.
print "函数内是局部变量 : ", total
return total;
#调用sum函数
sum( 10, 20 );
print "函数外是全局变量 : ", total
===
输出结果:
函数内是局部变量 : 30
函数外是全局变量 : 0
全局变量想作用于函数内,需加 global
:
globvar = 0
def set_globvar_to_one():
global globvar # 使用 global 声明全局变量
globvar = 1
def print_globvar():
print(globvar) # 没有使用 global
set_globvar_to_one()
print globvar # 输出 1
print_globvar() # 输出 1,函数内的 globvar 已经是全局变量