python 06 函数

函数,对象,模块

help() 函数用于查看函数或模块用途的详细说明。

 

def a():    定义a函数

  函数内容

>>a()

 

def a(b):  一个参数b

  print(b+3)

>>a(2)      5

 

def a(num1,num2):  可多个参数

  return (num1+num2)    返回值

 

>>print(a(1,2))  a(1,2)=3,print(3)

3

 

def a(name):

  'hi'

  print(name+'aq')

>>a.__doc__  输出文件开头注释的内容

hi

>>a(name=lo)  关键字参数

loaq

 

def a(name=lo):  默认参数

  print(name+'ap')

>>a()    存在默认参数,可不赋值

loap

>>a(we)  存在默认参数,也可赋值覆盖参数

weap

 

def a(*b):    收集参数,可多个参数(列表方式)

  print(len(b),b[1])

>>a(0,1,2,3)  

4,1

 

 

def a(*b,c):      或c=2

  print(b[1]+c)

>>a(0,1,2,c=3)    存在收集参数和另外一个参数时,需要用默认参数定义

4

 

有返回值的是函数,没有返回值的叫过程,python只有函数

def a():

  print(3)

>>a  无返回值

>>print(a)  返回none

none

 

def a():

  return [1,'ho',3.4]

>>a()    可返回列表

[1,'ho',3.4]

 

 

def a():

  return 1,'ho',3.4  ,为元组

>>a()

(1,'ho',3.4)    返回元组

 

def a(b):

  c=b+1:

  print(c)  #c=3

c=1

a(2)

print(c)  #c=1  

 

当局部变量中修改全局变量c时,自动创建一个与c名字相同的局部变量

所以最后一个print(c)   为全局变量时的值

最好不要在函数内使用全局变量

 

c=1

def a(b):

  global c  在局部改变全局变量

  c=b+1:

  print(c)  #c=3

 

print(c)  c=3

 

内嵌函数

def a1():

  print('0')

  def a2():

    print('1')

 

>>a1()    不可直接调用a2

0

1

 

闭包 编程方式

def a1(x):

  def a2(y):

    return x*y

  return a2

 

a2返回值为x*y

a1返回值a2

 

a1(3)(5)  #x=3,y=5

 

def a1():

  x=3

  def a2():  #x时上层(外部)函数变量,不可在下层(内部)函数中引用(修改)

    x*=x

    return x

  return a2

此函数报错

 

 

第一种改变方式

def a1():

  x=[3]

  def a2():  

    x[0]*=x[0]

    return x[0]

  return a2

 

第二种改变方式

def a1():

  x=3

  def a2(): 

    nonlocal x    #定义x不是局部变量 

    x*=x

    return x

  return a2

 

def ds(x):

  return 2 * x+1

>>ds(3)

7

 

g = lambda x: 2*x+1   # 定义了一个匿名函数

>>g(3)

7

 

def a(x,y):

  rerurn x + y

g = lambda x,y : x+y

 

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

filter(function, iterable)

function -- 判断函数。

iterable -- 可迭代对象。

 

 

def is_odd(n):

    return n % 2 == 1

 

tmplist = filter(is_odd, range(0,11))

newlist = list(tmplist)

print(newlist)

[1, 3, 5, 7, 9]

return 0  不返回任何东西

 

 

>>list(filter(lambda x :  x%2,range(10)))

[1,3,5,7,9]

 

lambda x : x%2 (匿名)判断函数 ,range(10) 迭代对象

filter 过滤, list换成列表

 

 

map() 会根据提供的函数对指定序列做映射。

map(a,b)    a(函数),b序列  a在b上对应的映射

 

>>>def square(x) :            # 计算平方数

...     return x ** 2

... 

>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方

[1, 4, 9, 16, 25]

>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数

[1, 4, 9, 16, 25]

 

# 提供了两个列表,对相同位置的列表数据进行相加

>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

[3, 7, 11, 15, 19]

 

阶乘

a=9

for i in range(1,9):  

  a *= i        1~9的阶乘

print("%d" % (a))    

 

递归实现

调用函数自身,有一个正确的返回条件

def a(n):

  if n == 1:

    return 1

  else:

    return n*a(n-1)

 

b=a(int(input()))

print("%d" % (b))

 

n=3

 

a(3)=3*a(2)

a(2)=2*a(1)

a(1)=1      向上算回去

 

斐波那契数列(接近黄金比)

   1, 当n=1

f(n)= 1,   当n=2

   f(n-1)+f(n-2), 当n>2

 

def f(n):

  n1=1

  n2=1

  n3=1

  while (n-2) > 0:

    n3 = n2+n1

    n1=n2

    n2=n3

    n -=1

  return n3

 

r=f(5)

print("%d" % (r))

 

while 3 > 0  n3=2  n1=1  n2=2  n=2(进1).

while 2 > 0  n3=3  n1=2  n2=3  n=1

while 1 > 0   n3=5  n1=3  n2=5  n=0

 

n3=n1+n2  n1,n2  前进1  (参数)n-1

 

 

用递归实现

def fad (n):

  if n<1:

    return -1

  if n==1 or n==2:

    return 1

  else:

    return f(n-1)+f(n-2)

 

r=f(5)

if r != -1:

  print ( "%d" % (r))

 

f(5)=f(4)+f(3)

f(4)=f(3)+f(2)

f(3)=f(2)+f(1)

f(2)=f(1)=1

 

递归总结

f(n)=f(n-1)+f(n-2)  f(1),f(2)

 

a(n)=n*a(n-1)    a(1)

 

 

用递归求解汉诺塔

#将x上的n个盘子借助y移动到z

def hanoi(n,x,y,z):    n盘子,x起始,y借助,z目标

  if n == 1:

    print(x,'-->',z)

  else:

    hanoi(n-1,x,z,y)  #将x上的n-1个盘子借助z移动到y上

    print(x,'-->',z)  #将最底下的最后一个盘子从x移动到z上

    hanoi(n-1,y,x,z)  #将y上的n-1个盘子借助x移动到z上

n = int(input())    #层数(盘子)

hanoi(n,x,y,z)

 

问题:将x上的n个盘子借助y移动到z

将x上的n-1个盘子借助z移动到y

将x上的最底下的第n个盘子从x移动到z

将y上的n-1个盘子借助x移动到z

 

问题拆分:将x上的n-1个盘子借助z移动到y

将x上的n-2个盘子借助y移动到z

将x上的最底下的第n-1个盘子移动到y

将z上的n-2个盘子借助x移动到y

 

 

hanoi(n-1,x,z,y)  #将n-1个盘子从x移动到y上

分部拆分  n=3

hanoi(2,x,z,y)

  hanoi(1,x,y,z)

  print(x-->y)

  hanoi(1,z,x,y)

 

hanoi(1,x,y,z)

  print(x-->z)

print(x-->y)

hanoi(1,z,x,y)

  print(z-->y)

 

将n-1个盘子从x移动到y上

x->z

x->y

z->y

 

 

 

 

 

 

 

 

 

 

 

 

    

 

posted @ 2018-08-21 17:41  愿君多采撷  阅读(134)  评论(0编辑  收藏  举报