此blog为博主自己对python的学习补充
因为之前学的只有跟着小象学院(当然,他教的特别好!),但是还是好多关于python的知识点需要日积月累的了解,所以)
1.类
2.函数
–函数的参数类型
类
参考blog https://blog.youkuaiyun.com/linshuhe1/article/details/51679096
1.定义
class Test(father_class):
pass
如上述代码,在python中声明一个类通过class关键词,class后面的Test就是此类的类名,类名之后的**(father_class)用来说明当前类继承了哪个父类,假如没有父类,则继承自(object)类。**
2.类的实例化,对象的创建:
t = Test()
3.类的__init__方法:
由于类起到模板的作用,所以,可以在创建实例的时候,把一些必要的属性强制填写进去,与我们在java的类的构造函数中所作的操作相似。这时候我们需要通过定义一个特殊的__init__方法,例如在创建的时候把name属性绑上去:
class Test(object):
def __init__(self,name):
self.name = name
注意:__init__的第一个参数永远是self,表示的是实例本身,所以在此方法中把属性绑定到self上即可。但是,假如**__init__方法之后,创建实例时**,就不能像上述中那样传入空的参数了,必须根据__init__方法的参数格式匹配参数,但是self是不需要传入的,Python解释器自己会把实例变量传进去:
>>>t = Test('linsh')
>>>print(t.name)
linsh
4.类的类方法:
class person(object):
def setName(self,name):
self.name = name
def getName(self):
return self.name
如上述代码所示,类方法的第一个参数也必须是self,其他和普通方法一样,调用的时候,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入:
p = person()
p.setName('lin')
name = p.getName()
print(name)
5.类的私有变量:
属性设置为私有的,即外部不能直接通过实例对象访问此属性,而应通过开放的接口来获取该属性:
class person(object):
def setName(self,name):
self.__name = name
def getName(self):
return self.__name
在属性name前面加上双下划线“__”即可将属性设置为私有,那么外部就不能直接通过实例对象.name来访问该属性了,而应通过该类的类方法getName()来访问此属性,否则会报错。
函数
在python中,我们通过def关键词来声明一个方法
def hello(): #无参函数
print('Hello!')
def hello(name): #带参函数
print('Hello,',name)
def getStr(firstName,lastName): #有返回
return lastName+firstName
python定义的函数还可以同时返回多个数据
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
原来返回值是一个tuple(元组)!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
函数的类型除了根据是否有返回值来划分之外,还可以根据带参情况来进行划分,划分为:必选参数、默认参数、可变参数、关键字参数和命名关键字参数。
1.必选参数:
必选参数函数就是调用函数时传入函数中的实参数量和顺序必须与函数声明时完全一致,否则会报错:
>>> power(5, 2)
25
>>> power(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: power() missing 1 required positional argument: 'n'
报错
2.默认参数:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
如上述代码所示,在声明power函数时,对第二个参数n设置了默认值,则在调用此函数时,可以有两种方式:一是传入两个参数的power(5,2);另一个是只传入一个参数power(5),此时第二个参数n会使用默认值,所以不会报错:
>>> power(5)
25
>>> power(5, 2)
25
3.可变参数:
顾名思义,可变参数的意思就是定义的函数传入参数可以是0个、1个…甚至无数个。对于需要传入多个参数,且参数数量不确定的函数,我们会想到将输入参数声明为一个list或者tuple,例如:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
但是,可变参数函数的调用,应该简化为一下形式:
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果已有一个list或者tuple,要将其传入可变参数函数中,有两种方式,显然第二种更为方便**,Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去**:
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
>>> calc(*nums)
14
4.关键字参数:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict:
def person(name, age, **kw):
print(‘name:’, name, ‘age:’, age, ‘other:’, kw)
kw就是关键字参数,调用时必须参数必须有实参输入,而关键字参数可以无输入:
>>> person('Michael', 30)
name: Michael age: 30 other: {}
添加任意关键字参数的形式,相当于一种key-value的形式,因为关键字参数最后会被保存成一个dict字典
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
也可以将一个已有的dict作为输入参数传入关键字参数函数中:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
****extra表示把extra这个dict的所有key-value用关键字参数传入到函数的kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
5.命名关键字参数:
假如只想接收关键字参数中的部分数据,我们可以通过条件语句进行筛选,如下只接收city和job关键字的数据:
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
但是,调用函数时仍然可以传入不受限制的关键字参数:
>>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
为了限制关键字参数,我们可以使用命名关键字参数
def person(name, age, *, city, job):
print(name, age, city, job)
和关键字参数kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名关键字参数调用时,必须传入参数名,否则会报错:
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given
命名关键字参数可以有缺省值,从而简化调用:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
上面函数调用时,由于city参数已有默认值,所以可以不传入该参数:
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
6.参数组合:
可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
包含类函数的类声明:
class person(object):
def setName(self,name):
self.name = name
def getName(self):
return self.name
p = person()
p.setName('lin')
name = p.getName()