函数
函数:定义函数,把参数的名字和位置确定下来,函数的接口定义就完成了,对于函数的调用者来说,只需要知道如何传递正确的参数,函数的内部细节被封装起来,调用者无需关心。
定义函数
Python 中,使用 def 语句定义一个函数。依次是 函数名,括号,括号中的参数和冒号,然后,在缩进块中编写函数体,函数的返回值使用 return 语句返回.
注意:函数一旦执行到 return 时,函数就执行完毕,并将结果返回;如果没有 return 语句,函数执行完毕后也会返回结果,只是结果为 None.
例如:
(1) 有 return 语句:
def add(a,b):
return a + b
print(add(1,2))
输出结果: 3
(2) 没有 return 语句:
def add_no_return(a,b):
a+b
print(add_no_return(1,2))
输出结果:None
空函数
空函数什么事都不做,使用 pass 语句。
def nofunc():
pass
返回多个值
Python 中函数可以返回多个值。
def getValue(x,y):
return x,y
print(getValue(3,6))
输出结果:(3, 6) ,是 tuple 数据类型
默认参数:
def power(x,n = 2):
s =1
while(n>0) :
n = n-1
s = s*x
return s
上例中,参数 n 即是默认参数,当调用该函数时,没有传递第二个参数时,n 默认就等于 2。
def power(x,n = 2):
res = 1
while(n>0):
res = res * x
n = n-1
return res
print(power(3))
print(power(3,2))
输出结果:输出结果一样,都是 9
注意:
- 必选参数在前,默认参数在后,否则会报错。
- 当函数有多个参数时,把变化大的参数放在前面,变化小的参数放在后面。变化小的参数就可以作为默认参数。
可变参数
可变参数:就是传入的参数个数是可变的,可以是 1 个,2 个,或任意个。
如何定义:定义可变参数和定义一个 list 或 tuple 参数类似,仅仅是在参数前面多加一个 * 号,在函数内部,其实是接收一个 tuple,所以可以传递任意个参数。
def calc(* numbers):
sum = 0
for num in numbers:
sum = sum + num
return sum
print(calc(1,2,3))
print(calc())
输出结果:
6
3
可变参数优势:可变参数和 list 或 tuple 参数相比,优势在于在调用函数时,不用事先构造一个 list,tuple 传递进去。
如果已经有一个 list 或 tuple,要调用一个可变参数怎么办?
Python 允许在 list 或 tuple 前面加一个 * 号,把 list 或 tuple的元素变成可变参数传进去。
nums=[2,3,4]
print(calc(*nums))
关键字参数
可变参数允许传入任意个参数,这些可编程参数在函数调用时自动组装为一个 tuple,而关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict.
函数高级特性
切片
取出 list 或 tuple 中部分元素,Python 提供了非常方便的方法。
常规方法 - while 循环:
arr=["java",True,11,22.11]
res = []
n = 3;
for i in range(n):
res.append(arr[i])
print(res)
Python 提供的切片操作符:
print(arr[0:3])
arrp[0:3] 表示,从索引 0 开始取,直到索引 3 为止,但不包括索引 3,即索引 0,1,2.一共 3 个元素(如果第一个索引是 0 ,则可以省略)。
当然,也可以是任意索引位置开始。
print(arr[1:2])
倒数切片:
倒数第一个元素的索引是 -1,取出后 2 个元素。
print(arr[-3:-1])
什么都不写,只写 [:] 就可以原样复制一个 list:
print(arr[:])
字符串切片
字符串 ‘abcdef’ 也可以看成是一种 list,每一个元素就是一个字符,因此,字符串也可以使用切片操作。操作的结果仍是字符串。
print("abcdef"[:3])
迭代
Python 中的迭代比 C,Java 中的迭代更加强大,即使迭代的数据类型没有下标的,只要是可迭代对象,都可以迭代。
例如:迭代出 dict 中的 key,value 值(dict 不是按照 list 的方式顺序排列,所以,迭代出来的结果顺序可能不一样):
迭代 dict :
op_map = {"Android":"Google","iOS":"Apple"}
for op_key in op_map:
print(op_key)
输出结果:
Android
iOS
默认情况下,迭代 dict,迭代的是 key 值,要想迭代出 value 值,需要使用 for value in dict.values()
op_map = {"Android":"Google","iOS":"Apple"}
for op_value in op_map.values():
print(op_value)
输出结果:
Google
Apple
同时迭代 key ,value
op_map = {"Android":"Google","iOS":"Apple"}
for op_key,op_value in op_map.items():
print("key = " + op_key + ",value = " + op_value)
输出结果:
key = Android,value = Google
key = iOS,value = Apple
迭代字符串 :
for ch in "abc":
print(ch)
通过 collections 模块的 Iterable 类型判断,是否是可迭代类型
from collections import Iterable
print(isinstance("abc",Iterable)) # True
print(isinstance(123,Iterable)) # False
print(isinstance([1,2,3],Iterable)) # True
list 下表循环:
for i,ch in enumerate(["a","b","c"]):
print(i,ch)
输出结果:
0 a
1 b
2 c
列表生成式
li = list(range(1,10))
print(li)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9],可以看出,range(a,b) 是不包括 b的,