Python学习函数,“利用函数修改元组的坑”

来源:互联网 发布:开淘宝店详细步骤 编辑:程序博客网 时间:2024/05/16 19:41

函数:通俗的讲就是将可以重复利用的功能封装成代码块,供其调取使用,函数能提高应用的模块性,和代码的重复利用率,系统内的函数叫做内建函数,用户也可以自定义函数,叫做用户自定义函数
1、函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
2、任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
3、函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
4、函数内容以冒号起始,并且缩进
5、语法结构:

def 函数名(参数列表):    函数体

简单函数实例:

#定义一个函数名为printName的函数,函数无返回值,只是打印一串字符,()函数调用符,可以看出调用printName函数后,打印>>> def printName():    print("Best Today")>>> printName()Best Today>>> 
#定义一个待返回值的函数printName,将传入的值返回给函数名为sendRose的函数,打印输出语句>>> def printName(name):    return name>>> def sendRose(name):    if name == "yun":        print("send Rose")    elif name == "yue":        print("send lily")>>> sendRose(printName("yun"))send Rose

6、传递参数有两种,一是可更改的对象,另一种是不可更改对象,在Python中strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象,接下来我们看些例子:

#Python中number被识别是number型的数据,我们把number传进去,可以看做是让num指向5存放的内存空间,修改num其实就是让num重新指向新的内存空间,而number则还是指向5的这块内存(个人理解)>>> number = 5>>> def reviseNum(num):    num = 10    print(num)>>> reviseNum(number)10>>> print(number)5>>> 
#Python中name被识别是string型的数据,我们把name传进去,可以看做是让参数name也指向“wang”存放的内存空间,修改参数name其实就是让参数name重新指向新的内存空间,而name则还是指向“wang”的这块内存(个人理解)>>> name = "wang">>> def reviseName(name):    name = name + "yun"     print(name,id(name))>>> reviseName(name)wangyun 4590679520>>> print(name)wang>>> id(name)4591245776>>> id("wang")4591245776>>> id("wangyun")4591245608>>>
#特别注意::::我们定义一个reviseTuple可以传递一个元组的参数,该元组包含一个列表和两个字串,我们在函数内修改元组中列表的值,输出后,元组里面的数据也发生变化,当我们修改字串时,编译器会报出“TypeError: 'tuple' object does not support item assignment”,这点有人就该问,我明明修改元组里面的值,为什么元组说是不可改变的呢?其实我们可以认为元组里面存放的时元素的地址,元素改变地址肯定改变,而列表和字典支持原位修改的,修改后只是内存大小的改变而地址是不改变的,所以我们修改了列表后,元组也发生了改变,从这点我们也可以看出当我们传入字典或者列表进行修改,同样会修改原来的值,原因是一样,列表和字典支持原位修改,而地址不变(个人理解)//修改列表>>> t1 = ([1,2,3],"wang","yun")>>> t1([1, 2, 3], 'wang', 'yun')>>> def reviseTuple(t):    l1 = t[0]    l1[0] = 10    print(t)>>> reviseTuple(t1)([10, 2, 3], 'wang', 'yun')>>> print(t1)([10, 2, 3], 'wang', 'yun')>>> //修改字典>>> t1 = ({"wang":"good"},"wang","yun")>>> t1({'wang': 'good'}, 'wang', 'yun')>>> def reviseTuple(t):    dict1 = t[0]    dict1["wang"] = "bad"    print(t)>>> reviseTuple(t1)({'wang': 'bad'}, 'wang', 'yun')>>> t1({'wang': 'bad'}, 'wang', 'yun')>>> 

7、参数传递中参数设定
(1).必需参数,我们上面的简单示例的sendRose(name),name这个参数在调用的时候是必须要传递的否则会报错,且必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
(2).关键字参数,使用关键字参数允许函数调用时参数的顺序与声明时不一致

#传入参数可以和调用的不一致>>> def printNameAndAge(str, int):    print("%s : %d" %(str,int))>>> printNameAndAge(int =30,str ="wang")wang : 30>>> 

(3).默认参数,调用函数时,如果没有传递参数,则会使用默认参数

>>> def printNameAndAge(name, age = 25):  #注意:::默认参数必须放在最后    print("%s : %d" %(name, age))>>> printNameAndAge("wang")wang : 25>>> printNameAndAge("wang", 16)wang : 16#这样调用函数也可以使调用参数与声明的不一致(必须指定参数赋值)>>> printNameAndAge(age = 16, name = "wang")wang : 16>>> 

(4)不定长参数,当你声明一个函数,但是不知道需要多少参数合适时,这时不定参数就派上用场了

>>> def printName(name1,name2, *randomTuple):    print(name1,name2)    for name in randomTuple:        print(name)>>> printName("wang", "yun", "xiaomi","iphone")wang yunxiaomiiphone>>> printName("wang", "yun", "xiaomi","iphone","wang", "yun", "xiaomi","iphone")wang yunxiaomiiphonewangyunxiaomiiphone>>> 

8、匿名函数,关键字lambda,可以理解为是一个表达式不是代码块,以lambda开头返回一个函数,但是lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
语法结构: lambda [arg1 [,arg2,…..argn]]:expression

#简单使用>>> count = lambda num1,num2:num1 * num2>>> print (count(num2 = 15, num1 = 22))330>>> print (count(10, 100))1000>>> 

9、Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这这些语句内定义的变量,外部也可以访问

>>> def printAge():    num = 10   #局部>>> numTraceback (most recent call last):  File "<pyshell#4>", line 1, in <module>    numNameError: name 'num' is not defined>>> if True:    num1 = 20>>> num120