基础小示例
基础小示例
1.求一个数的n次方。

1.求一个数的n次方。 def power(x,n): s = 1 while n > 0: n = n-1 s = s*x return s print(power(5,2)) print(power(5,3)) 打印结果: 25 125 2.另一种形式,设置默认参数。 def power(x,n=2): s = 1 while n > 0: n = n-1 s = s*x return s print(power(5)) print(power(6)) 打印结果: 25 36
2.默认参数必须指向不变对象。(不变对象有:str和None)

1.当我们的默认参数不是指向不变对象时。 def add_data(L=[]): L.append('end') return L print(add_data()) print(add_data()) 打印如下: 它是会叠加的。 ['end'] ['end', 'end'] 2.当我们的默认参数指向的是不变对象时。 def add_data(L=None): if L is None: L=[] L.append('end') return L print(add_data()) print(add_data()) 打印如下: 它总指向原始的值 ['end'] ['end']
3.可变参数: (*args)

1.由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来 def calc(numbers): sum = 0 for n in numbers: sum = sum + n*n return sum print(calc([1,2,3])) print(calc((1,3,5,7))) 2.调用可变参数:(*args) def calc(*numbers): sum = 0 for n in numbers: sum = sum + n*n return sum print(calc(1,2,3)) print(calc(1,3,5,7)) 3.如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做: nums= [1,2,3] print(calc(nums[0],nums[1],nums[2])) 这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去: nums = [1,3,5,7] print(calc(*nums))
4.关键字参数: (**kwargs)

1.可变参数可以传:0个或任意个的参数,它自动组装为一个tuple。 2.关键字参数可以传: 0个或任意个含参数名的参数,它自动组装为一个dict。 1.函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数: def person(name,age,**kwargs): return name,age,kwargs print(person('aray',18)) 打印如下: ('aray', 18, {}) 2.也可以传入任意个数的关键字参数: def person(name,age,**kwargs): return name,age,kwargs print(person('aray',18,city='SHENZHEN')) print(person('aray',18,city='SHENZHEN',hobby='play a game')) 打印如下: ('aray', 18, {'city': 'SHENZHEN'}) ('aray', 18, {'city': 'SHENZHEN', 'hobby': 'play a game'}) 3.关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。 4.和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去: def person(name,age,**kwargs): return name,age,kwargs print(person('aray',18)) kw = {'city':'SHANGHAI','hobby':'play a game'} print(person('Tom',20,city=kw['city'],hobby=kw['hobby'])) 打印如下: ('aray', 18, {}) ('Tom', 20, {'city': 'SHANGHAI', 'hobby': 'play a game'}) 5.当然,上面复杂的调用可以用简化的写法: def person(name,age,**kwargs): return name,age,kwargs print(person('aray',18)) kw = {'city':'SHANGHAI','hobby':'play a game'} print(person('Kim',22,**kw)) 打印如下: ('aray', 18, {}) ('Kim', 22, {'city': 'SHANGHAI', 'hobby': 'play a game'})
4.递归函数:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

def fact(n): if n==1: return 1 return n * fact(n-1) # print(fact(0)) print(fact(1)) print(fact(2)) print(fact(3)) print(fact(4)) print(fact(5)) 打印如下: 1 2 6 24 120 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。 针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。 Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。