zoukankan      html  css  js  c++  java
  • python学习---函数参数

      1 #!/usr/bin/python3 
      2 # -*- coding: utf-8 -*-
      3 '''
      4 Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
      5 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
      6 要注意定义可变参数和关键字参数的语法:
      7 *args是可变参数,args接收的是一个tuple;
      8 **kw是关键字参数,kw接收的是一个dict。
      9 以及调用函数时如何传入可变参数和关键字参数的语法:
     10 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
     11 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
     12 使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
     13 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
     14 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
     15 '''
     16 
     17 def power(x): # 参数x是必须参数
     18     return x * x
     19 
     20 print(power(5))
     21 
     22 def power(x,n): #参数x, n是必须参数
     23     s = 1
     24     while n > 0:
     25         n = n - 1
     26         s = s * x
     27     return s
     28 
     29 print(power(5,2))
     30 #print(power(5)) 错误 
     31 
     32 
     33 def power(x,n=2): #参数x必须参数,参数n默认参数
     34     s = 1
     35     while n > 0:
     36         n = n - 1
     37         s = s * x
     38     return s
     39 
     40 print(power(5,2))
     41 print(power(5))
     42 # 必选参数在前,默认参数在后
     43 #当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。
     44 
     45 def calc(numbers): #numbers是必须参数
     46     sum = 0
     47     for n in numbers:
     48         sum = sum + n * n
     49     return sum
     50 print(calc([1,2,3])) #参数时一个列表
     51 print(calc((1,3,5,7))) #参数时一个元组
     52 
     53 def calc(*numbers): #参数numbers是可变参数,参数numbers接收到的是一个tuple
     54     sum = 0
     55     for n in numbers:
     56         sum = sum + n * n
     57     return sum
     58 
     59 print(calc(1,2))
     60 print(calc())
     61 nums = [1,2,3,4]
     62 print(calc(nums[0],nums[1],nums[2],nums[3])) #等价于print(calc(*nums))
     63 print(calc(*nums))
     64 
     65 '''
     66 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
     67 而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装
     68 为一个dict
     69 '''
     70 def person(name,age, **kw): #name,age 必选参数;kw关键字参数
     71     print('name: ',name, 'age:', age, 'other:', kw)
     72 
     73 person('张飞', 32)
     74 person('刘备', 35, city='中国')
     75 person('关羽', 34, city='中国', job='武将')
     76 extra = {'city': '北京','工作': '武将','战斗值': '98'}
     77 person('赵云',28,**extra)
     78 
     79 '''
     80 命名关键字参数
     81     对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数
     82     至于到底传入了哪些,就需要在函数内部通过kw检查。
     83     如果要限制关键字参数的名字,就可以用命名关键字参数。
     84 '''
     85 def person(name, age, *, city, job):
     86     print(name, age, city, job)
     87 
     88 person('Hayden', 32, city='shanghai',job='Engineer')
     89 
     90 def person(name, age, *args, city, job):  #等价于def person(name, age, *, city, job):
     91     print(name, age, city, job)
     92 
     93 person('Hayden', 32, city='shanghai', job='Engineer')
     94 
     95 '''
     96 参数组合:
     97      在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,
     98      这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变
     99      参数、命名关键字参数和关键字参数。
    100 '''
    101 def f1(a, b, c=0, *args, **kw):
    102     print('a =', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)
    103 
    104 def f2(a, b, c=0, *, d, **kw):
    105     print('a=', a, 'b=', b, 'c=', c, 'd=', d, 'kw=', kw)
    106 
    107 f1(1,2) #a = 1 b= 2 c= 0 args= () kw= {}
    108 f1(1,2,c=3) #a = 1 b= 2 c= 3 args= () kw= {}
    109 f1(1,2,3,'a','b') #a = 1 b= 2 c= 3 args= ('a', 'b') kw= {}
    110 f1(1,2,3,'a','b',x=99) #a = 1 b= 2 c= 3 args= ('a', 'b') kw= {'x': 99}
    111 f2(1,2,d=99,ext=None) #a= 1 b= 2 c= 0 d= 99 kw= {'ext': None}
    112 
    113 #所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,
    114 #无论它的参数是如何定义的。
    115 args = (1,2,3,4)
    116 kw = {'d':99, 'x':'#'}
    117 f1(*args, **kw) #a = 1 b= 2 c= 3 args= (4,) kw= {'d': 99, 'x': '#'}
    118 
    119 args=(1,2,3)
    120 kw = {'d':88, 'x':'#'} 
    121 f2(*args, **kw) #a= 1 b= 2 c= 3 d= 88 kw= {'x': '#'}
  • 相关阅读:
    进程池,线程池,协程,gevent模块,协程实现单线程服务端与多线程客户端通信,IO模型
    线程相关 GIL queue event 死锁与递归锁 信号量l
    生产者消费者模型 线程相关
    进程的开启方式 进程的join方法 进程间的内存隔离 其他相关方法 守护进程 互斥锁
    udp协议 及相关 利用tcp上传文件 socketserver服务
    socket套接字 tcp协议下的粘包处理
    常用模块的完善 random shutil shevle 三流 logging
    day 29 元类
    Django入门
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/hayden1106/p/7681891.html
Copyright © 2011-2022 走看看