转变的参数

  多个参数输入

  位置参数

  关键字参数

  默认值

  不定长参数: * 和 **

  通报随便数目的参数值

  通报随便数目的键值对

  通报元组、列表、字典

  通报元组

  通报列表

  通报字典

  通报可能发生的问题

  多个参数输入

  昨天程序里大多是只有一个参数的函数,不需要思量其它问题。当我们需要多参数时,有以下几种通报设施可选

  位置参数

  位置参数,就是在通报参数值的时刻,必须和函数界说的参数一一对应,否则通报会发生误传甚至报错。

  例如下面这个有两个参数的函数:

  def price(name,cost):

  print('商品名称:%s,价钱:%d'%(name,cost))

  >>> price('Mate30',4999) #准确输入

  商品名称:Mate30,价钱:4999

  >>> price(4999,'Mate30') #错误输入

  TypeError: %d format: a number is required, not str

  然鹅听说这种传参是最常用的方式之一。

  这种牢固形式通报的方式,要求我们对参数足够熟悉,才气制止输错(用help啊)

  关键字参数

  为了制止发生适才的问题,就有了关键字参数:

  依然是price函数

  def price(name,cost):

  print('商品名称:%s,价钱:%d'%(name,cost))

  为了制止输错,在输入参数的时刻,我们可以用 指定参数名=值 的方式。

  这里直接反着输入试一下:

  >>> price(cost=4999,name='Mate30')

  商品名称:Mate30,价钱:4999

  在参数比较少的时刻,我们也可以只指定一个参数:

  >>> price('Mate30',cost=4999)

  商品名称:Mate30,价钱:4999

  然则,只能是以“左边不指定,右边指定”的 方式,若是反过来:

  >>> price(name='Mate30',4999)

  SyntaxError: positional argument follows keyword argument

  >>> price(cost=4999,'Mate30')

  SyntaxError: positional argument follows keyword argument

  这是说关键字参数不准确的意思

  默认值

  默认值就是在界说函数的时刻直接让参数=一个值,当没有给这个参数传值的时刻,这个参数就会用它自己的默认值

  def price(name='',cost=998):

  print('商品名称:%s,价钱:%d'%(name,cost))

  这里就是默认给name参数’ ’ ,默认给cost参数998

  >>> price('ABC')

  商品名称:ABC,价钱:998

  然则,默认值的使用也有局限性,在这个函数里,默认情形是输入一个值,当我们输入price(6666)时,输出则会是

  >>> price(6666)

  商品名称:6666,价钱:998

  而且和关键字参数一样,默认值界说函数的时刻,也只能以“左边不指定,右边指定”的 方式,反过来则会报错

  >>> def price(name='ABC',cost):

  print('商品名称:%s,价钱:%d'%(name,cost))

  SyntaxError: non-default argument follows default argument

  不定长参数: * 和 **

  为了使用方便,我们在界说函数的时刻是可以设置成不定长参数的

  通报随便数目的参数值

  花样:

  函数名([参数1,参数2,.....参数n,]*不定长参数)

  有一点要注重的是,带 * 的参数虽可以接受随便数目的值,然则一个自界说函数里只能有一个带 * 的参数,而且只能放在最右边。

  例子如下:

  这是一个纪录了一天都完成什么义务的函数,完成的义务数目是不定的,以是要在result前面加一个*,这样result就是一个不定长参数

  >>> def record(date,*result):

  print(date)

  temp = ''

  for i in result:

  temp += ' ' + i

  print(temp)

  输入当日完成义务:

  >>> record('4月27日','Day11','高数Day11','英语Day11')

  4月27日

  Day11 高数Day11 英语Day11

  而这个不定长参数是以什么形式保留的呢?type一下便知

  ...

  print(type(result))

  ...

  4月27日

  Day11 高数Day11 英语Day11

  通报随便数目的键值对

  花样:

  函数名([参数1,参数2,.....参数n,]**不定长参数)

  同样,一个自界说函数只能有一个带 ** 的不定长参数,而且只能放在最右边。唯一差别的就是,现在通报的是键值对。

  依然以纪录义务为例,但这次要改成键值对的样子:

  def record(date,**result):

  print(date)

  print(result)

  输入完成的义务(注重这里输入键和值的写法)

  >>> record('4月27日',='Day11',高数='Day11',英语='Day11')

  4月27日

  {'': 'Day11', '高数': 'Day11', '英语': 'Day11'}

  type一下就知道这次通报回来的是什么类型的数据了

  通报元组、列表、字典

  通报元组

  >>> def record(date,result):

  print(date)

  print(type(result))

  print(result)

  >>> record('4月27日',('Day11','高数Day11','英语Day11'))

  4月27日沈阳妇科医院 http://yyk.39.net/hospital/fc843_doctors.html

  ('Day11', '高数Day11', '英语Day11')

  通报列表

  函数同上,只不过在输入的时刻换成列表了

  >>> record('4月27日',[Day11','高数Day11','英语Day11'])

  4月27日

  ['Day11', '高数Day11', '英语Day11']

  通报字典

  函数依旧稳定,输入再改成字典

  >>> D = {'': 'Day11', '高数': 'Day11', '英语': 'Day11'}

  >>> record('4月27日',D)

  4月27日

  {': 'Day11', '高数': 'Day11', '英语': 'Day11'}

  通报可能发生的问题

  以列表为例,自界说一个单价打折函数:

  >>> def discount(Mobile,price):

  print(Mobile)

  price[1] *= 0.9

  print(price)

  输入

  >>> L = ['Mate30',4999]

  >>> discount('HUAWEI',L)

  HUAWEI

  ['Mate30', 4499.1]

  然则当我们再查看列表L的时刻

  >>> L

  ['Mate30', 4499.1]

  我们发现,L也被改变了,这是由于无论通报前照样通报后的工具(列表、元组、字典)都是指向同一个地址的,一旦我们在自界说函数内部让工具发生改变,这个改变会导致输入的工具也发生改变,而这往往是我们不希望发生的,以是为了制止这个征象发生,我们可以复制该工具。

  函数应改为:

  >>> def discount(Mobile,price):

  print(Mobile)

  L1 = price.copy()

  L1[1] *= 0.9

  print(L1)

  再重新输入

  >>> discount('HUAWEI',L)

  HUAWEI

  ['Mate30', 4499.1]

  >>> L

  ['Mate30', 4999]

  云云就会制止这个问题

  …

  …