Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1778445
  • 博文数量: 276
  • 博客积分: 1574
  • 博客等级: 上尉
  • 技术积分: 2894
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-26 23:23
个人简介

生活的美妙在于,不知道一下秒是惊艳还是伤神,时光流转,珍惜现在的拥有的时光

文章分类

全部博文(276)

文章存档

2017年(17)

2016年(131)

2015年(63)

2013年(2)

2012年(32)

2011年(31)

分类: Python/Ruby

2016-02-24 22:55:56


点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf8 -*-
  3. '''
  4. 参数(argument或parameter)
  5. 对象作为输入发送给函数的方式,参数赋值给函数中的一个名称。
  6. 传递参数
  7.     参数的传递是通过自动将对象赋值给本地变量名来实现的。
  8.     函数内部的参数名的赋值不会影响调用者。
  9.     改变函数的可变对象参数的值也许会对调用者有影响
  10.     不可变参数‘通过值’进行传递。如字符串,整数。
  11.     可变参数通过‘指针’进行传递。如列表,字典。
  12. 避免可变参数的修改
  13.     python的类依赖原处修改一个传入的“self”参数来更新对象状态。
  14.     如果不想函数内部的修改影响传递给它的对象,可以明确的创建可变对象的拷贝。如L=[:]
  15.     为了真正意义上防止这些改变,将可变对象转换成不可变对象来解决。例如元组,tuple()函数。但使用这种技术会让函数失去一种参数能够调用任意列表特定方法的能力,包括不会在原处改变对象的那些方法都不再能够使用。
  16.     函数能够升级为传入可变对象的形式。
  17.     必须要有意识到这个属性:如果在你没有预期的情况下对象在外部发生了改变,检查一下是不是一个调用了函数引起的,并且有必要的话当传入对象时进行拷贝。
  18. 对参数输出进行模拟
  19.     return可以返回任意种类的对象,所以它也能名返回多个值。
  20. 特定的参数匹配模型
  21.     参数在python总是通过赋值传递的。
  22.     默认情况下,参数是通过其位置进行匹配的,左右顺序,精确的传递数量一样多的参数。
  23.     参数位置:从左至右进行匹配
  24.     关键字参数:通过参数名进行匹配。name=value形式语法。
  25.     默认参数:为没有传入值的参数定义参数值。还是name=value语法。
  26.     可变参数:收集任意多基于位置或关键字的参数。以×号开头,收集任意多的额外参数。
  27.     可变参数解包:传递任意多的基于位置或关键字的参数。
  28.         同样使用×。只不过与函数头部的×恰恰相反:在函数头部它意味着收集任意多的参数,在调用者中意味着传递任意多的参数。
  29.     keyword-only参数:参数必须按照名称传递。
  30.     匹配语法:
  31.         语法 位置 解释
  32.         func(value) 调用者 常规参数:通过位置进行匹配
  33.         func(name=value) 调用者 关键字参数:通过变量名匹配
  34.         func(*sequence) 调用者 以name传递所有的对象,并作为独立的基于位置的参数
  35.         func(**dict) 调用者 以name成对的传递所有的关键字/值,并作为独立的关键字参数
  36.         def func(name) 函数 常规参数:通过位置或变量名进行匹配
  37.         def func(name=value) 函数 默认值参数,如果没有在调用中传递的话。
  38.         def func(*name) 函数 匹配关收集(在元组中)所有包含位置的参数。收集除了位置,关键字参数外的其它参数到元组中。
  39.         def func(**name) 函数 匹配差收集(在字典中)所有包含位置的参数。收集除了位置,关键字参数外的其它参数到字典中。
  40.         def func(*args,name) 函数 参数必须在调用中按照关键字传递。
  41.         def func(*,name=value) 函数 (python3.0)
  42. python参数匹配的顺序法则:
  43.     函数调用时,任何位置参数(value),后面跟着任何关键字参数(name=value)和*sequence组合后面跟着**dict形式。
  44.     函数头部定义时,任何一般参数(name),紧跟默认参数(name=value),如果有的话,后面是*name(或*)的形式,后面跟着任何name或name=value keyword-only参数,后面踊着**name形式。
  45.     在调用时表示关键字参数,在函数字义时表示默认参数。

  46.     1,通过位置分配非关键字参数。
  47.     2.通过匹配变量名分配关键字参数。
  48.     3.其它额外的非关键字参数分配到*name元组中。
  49.     4.其它额外的关键字参数分配到**name字典中。
  50.     5.用默认值分配给在头部未得到分配的参数。
  51. '''


  52. # 参数和共享引用
  53. def f(a):
  54.     a = 99


  55. b = 88
  56. f(b) # 将b整数对象的值赋给a
  57. print(b) # 88 b的值未受函数内部赋值的影响。


  58. def changer(a, b):
  59.     a = 2
  60.     b[0] = 'talen'


  61. X = 1
  62. Y = [1, 2]
  63. changer(X, Y)
  64. print(X, Y) # (1, ['talen', 2])对于列表这种可变对象的传递,函数内部修改了引用后会影响到调用者的变量。当然这种原处修改,只有在修改的对象比函数生命更长的时候才会影响调用者。

  65. X = 1
  66. a = X
  67. a = 2
  68. print(X) # 1 #对X没有任何影响
  69. L = [1, 2]
  70. b = L
  71. b[0] = 'talen'
  72. print(L) # ['talen', 2] #对可变对象的原处修改,影响了引用者的值。

  73. L = [1, 2]
  74. changer(X, L[:])
  75. print(X, L) # (1, [1, 2]) #对拷贝L[:]的修改没有影响L的对象。


  76. def multiple(x, y):
  77.     x = 2
  78.     y = [3, 4]
  79.     return x, y


  80. C, D = multiple(1, 2)
  81. print(C, D) # (2, [3, 4]) #返回了数组对象,勇冠赋值打印出结果。

  82. # 参数匹配

  83. print('默认值参数')


  84. def f(a, b, c=3000):
  85.     print(a, b, c)


  86. print('位置参数')
  87. f(9, 8, 7)

  88. print('关键字参数')
  89. f(b=20, c=30, a=10) # (10, 20, 30) #调用者传入的参数必须跟函数字义的参数名一致。
  90. f(100, c=300, b=100) # (100, 100, 300) #混合使用时位置参数优先匹配,所以a变量的位置必须固定。

  91. f(1000, b=2000) # (1000, 2000, 3000) #c会使用默认值参数
  92. f(10000, b=2) # (10000, 2, 3000) #默认值与关键字参数混合


  93. def func(spam, eggs, toast=3, ham=4):
  94.     print((spam, eggs, toast, ham))


  95. func(1, 2) # (1, 2, 3, 4) #位置参数与默认值混合
  96. func(1, ham=44, eggs=22) # (1, 22, 3, 44) #位置参数,关键字与默认值混合
  97. func(spam=111, eggs=222) # (111, 222, 3, 4) #关键字与默认值混合
  98. func(toast=3333, eggs=2222, spam=1111) # (1111, 2222, 3333, 4)#同上
  99. func(1, 2, 3, 4) # (1, 2, 3, 4) #位置参数

  100. print('任意参数*,**')


  101. # 在函数定义中,在元组中收集不匹配的位置参数。
  102. # **只对关键字参数有效
  103. def t(*args):
  104.     print(args)


  105. t()
  106. t(1)
  107. t(1, 2, 3, 5)


  108. def d(**args):
  109.     print(args)


  110. d()
  111. d(a=100, b='sf')

  112. print('混合使用')


  113. def all(a, *pargs, **kargs):
  114.     print(a, pargs, kargs)


  115. all(100, 3, 4, 5, x=77, b=99) # (100, (3, 4, 5), {'x': 77, 'b': 99})
  116. print('调用时解包参数')
  117. args = (1, 2)
  118. args += (5, 6)
  119. func(*args)
  120. func(*(1,2),**{'toast':67,'ham':788})

  121. def tracer(fund,*pargs,**kargs):
  122.     print('calling:',fund.__name__)
  123.     return fund(*pargs,**kargs)
  124. def fund(a,b,c,d):
  125.     return a+b+c+d
  126. print(tracer(fund,1,2,c=3,d=4))


  127. print('min')
  128. def min1(*targs):
  129.     res=targs[0]
  130.     for arg in targs[1:]:
  131.         if arg < res:
  132.             res=arg
  133.     return res
  134. print(min1(6,7,8,1,2))
  135. def min2(first,*targs):
  136.     res=first
  137.     for arg in targs:
  138.         if arg < res:
  139.             res=arg
  140.     return res
  141. print(min2(8,6,4,5,7))
  142. def min3(*targs):
  143.     tmp=list(targs)
  144.     tmp.sort()
  145.     return tmp[0]
  146. print(min3(23,34,45,325,22,3,23345,89))
  147. print(min1('bb','aa'))
  148. print(min3([2,2],[1,1],[3,3]))

  149. #函数作为另一种参数对象可以传入一个函数。
  150. def minmax(test,*margs):
  151.     res=margs[0]
  152.     for arg in margs[1:]:
  153.         if test(arg,res): #如果为真,返回arg的值,test可套用大于,小于等不同定义的函数。
  154.             res=arg
  155.     return res

  156. def lessthan(x,y):
  157.     return x < y
  158. def grtrthan(x,y):
  159.     return x>y

  160. print(minmax(lessthan,5,3,21,3,5,3,25,45,26,6,7,100,325))
  161. print(minmax(grtrthan,324,243,3,5,6,7,8,8,3,2,967))

  162. #通用set函数
  163. def intersect(*sargs):
  164.     res = []
  165.     for x in sargs[0]:
  166.         for other in sargs[1:]:
  167.             if x not in other:
  168.                 break
  169.             else:
  170.                 res.append(x)
  171.     return union(res) #书上这一块感觉有错误,没有将重复的去除。

  172. def union(*sargs):
  173.     res=[]
  174.     for seq in sargs:
  175.         for x in seq:
  176.             if not x in res:
  177.                 res.append(x)
  178.     return res
  179. s1,s2,s3='spam','scam','slam'
  180. #print(intersect(s1,s2))
  181. #print(union(s2,s3))
  182. print('多个参数')
  183. print(intersect(s1,s2,s3))
  184. print(union(s1,s2,s3))


点击(此处)折叠或打开

  1. /usr/bin/python2.7 /home/talen/PycharmProjects/untitled/t18.py
  2. 88
  3. (1, ['talen', 2])
  4. 1
  5. ['talen', 2]
  6. (1, [1, 2])
  7. (2, [3, 4])
  8. 默认值参数
  9. 位置参数
  10. (9, 8, 7)
  11. 关键字参数
  12. (10, 20, 30)
  13. (100, 100, 300)
  14. (1000, 2000, 3000)
  15. (10000, 2, 3000)
  16. (1, 2, 3, 4)
  17. (1, 22, 3, 44)
  18. (111, 222, 3, 4)
  19. (1111, 2222, 3333, 4)
  20. (1, 2, 3, 4)
  21. 任意参数*,**
  22. ()
  23. (1,)
  24. (1, 2, 3, 5)
  25. {}
  26. {'a': 100, 'b': 'sf'}
  27. 混合使用
  28. (100, (3, 4, 5), {'x': 77, 'b': 99})
  29. 调用时解包参数
  30. (1, 2, 5, 6)
  31. (1, 2, 67, 788)
  32. ('calling:', 'fund')
  33. 10
  34. min
  35. 1
  36. 4
  37. 3
  38. aa
  39. [1, 1]
  40. 3
  41. 967
  42. 多个参数
  43. ['s', 'a', 'm']
  44. ['s', 'p', 'a', 'm', 'c', 'l']

  45. Process finished with exit code 0


阅读(1130) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~