python学习笔记(一)

这里主要是总结学习过程中遇到的一些问题和注意事项



  1. 关于函数参数问题

    默认参数

    函数参数可以有默认参数,而默认参数使用不当很容易掉坑里。

    def personInfo(name,age = 22,city = 'BeiJing'):
    	print(name,age,city)
    
    personInfo('allen')                # ==> allen 22 BeiJing        
    personInfo('allen',city = 'SH')    # ==> allen 22 SH
    personInfo('allen',18)             # ==> allen 18 BeiJing
    
    

    以上函数执行的时候,没有问题,很正常。在看一下下面的函数

    def add_end(L = []):
    L.append('END')
    print(L)
    
    add_end([1,2,3])                   # ==> [1, 2, 3, 'END']
    add_end()                          # ==> ['END']
    add_end()						   # ==> ['END', 'END']
    

    我们看到默认值是[],为什么调用两次之后add_end()之后会出现['END', 'END']这样的结果,原因是[]是可变对象,如果学过c++的同学可能很容易理解,在里的L是一个指针,指向一块地址,而这块地址的内容在多次调用add_end()之后内容发生变化,而指针所指向的地址未发生变化。这里我们需要注意:定义默认参数要牢记一点:默认参数必须指向不可变对象
    修改上述例子:

    def add_end(L=None):
    	if L is None:
    		L = []
    	L.append('END')
    	print(L)
    

    可变参数

    在参数前面加一个*号,函数内部参数param接收到一个tuple。同样Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去

    def printParam(*param):
    	for x in param:
    		print(x)
    
    printParam(1,2,3)                # ==> 1,2,3
    printParam([1,2,3])              # ==> [1,2,3]
    printParam(*[1,2,3])             # ==> 1,2,3
    

    关键参数

    关键参数
    **+参数,如**kw,kw将获得一个dict.

    # 关键字参数
    def person(name,age,**kw):
    	print('name:',name,'age:',age,'kw:',kw);
    
    person('yy',22)
    person('yy',22,city = 'BJ',addr = 'CY')
    

    命名关键参数
    和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,后面的参数被视为命名关键字参数。有一种情况,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符了。

    # 命名关键字参数
    # 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
    def student(name,age,*,city,grade):
    	print('name:%s,age:%d,city:%s,grade:%s'%(name,age,city,grade))
    
    student('DH',12,city="BeiJing",grade = 'A') #==> name:DH,age:12,city:BeiJing,grade:A
    student('DH',12)   #==> 提示缺少 'city' and 'grade' 参数     
    
    # 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
    def student2(name,age,*args,city,grade):
    	print('name:%s,age:%d,city:%s,grade:%s, args:'%(name,age,city,grade),args)
    
    student2('DH',12,1,2,3,4,city="BeiJing",grade = 'A') #==> name:DH,age:12,city:BeiJing,grade:A, args: (1, 2, 3, 4)
    
  2. 关于函数作为返回值

    我们来看一个函数

    def count():
    	fs = []
    	for i in range(1,4):
    		def f():
    			return i * i
    		fs.append(f)
    	return fs
    
    for f in count():
    	print(f()) //==>9 9 9 
    

    看看这个函数,输出结果跟我们预想的1,4,9不符合。这是因为变量i在循环3次之后,i已经变成3了,因此结果是9,9,9
    注意:返回闭包时牢记一点,返回函数不要引用任何循环变量,或者后续会发生变化的变量
    上个函数我们做个改变

    def count():
    	def f(j):
    		def g():
    			return j * j
    		return g
    	fs = []
    	for x in range(1,4):
    		fs.append(f(x));
    	return fs
    
  3. 关于Function 和 Method理解

    class  Student(object):
    	def set_age(self,age):
    		self.age = age
    
    def set_name(self,name):
    	self.name = name
    
    Student.set_name = set_name
    print(type(Student.set_name))   #==> <class 'function'>
    print(type(Student.set_age))    #==> <class 'function'>
    
    s = Student()
    print(type(s.set_name))         #==> <class 'method'>
    print(type(s.set_age))          #==> <class 'method'>
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值