基础小示例

基础小示例

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
一个数的n次方

 

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标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
递归函数

 

posted @ 2018-01-13 01:45  Aray007  阅读(135)  评论(0)    收藏  举报