一、Python函数定义与调用

1.Python函数的概念

函数:是组织好的、可重复使用的,用来实现单一or相关联概念的代码段。函数能提高应用的模块性,代码的复用性。如print()、range()函数,也可以自定义函数。

2.Python函数的定义&调用

案例:定义一个函数Max_num(),用来比较两个数字的大小,然后将数值大的数字返回。

1)函数代码块以def关键字开头,厚街函数标识符名称和圆括号()
2)圆括号之间可以用于定义参数
3)函数内容以冒号起始,并且缩进
4)return[表达式]选择性地返回一个值给调用方,不带表达式的return相当于返回None

  1. #定义一个带参数的函数,实现获取最大值
  2. def Max_num(a,b):
  3. if a > b:
  4. return a
  5. elif a < b:
  6. return b
  7. else:
  8. return a
  9. #调用函数
  10. result = Max_num(22,10)
  11. #输出调用的结果
  12. print(result)

3.方法参数的个数及调用

  1. def fun_args1(a1): # 方法包含1个参数;实现输出该参数
  2. print("args is %s" %a1)
  3. def fun_args2(a1,a2):
  4. print("args is %s and %s" %(a1,a2))
  5. def fun_var_args(*a):
  6. for value in a:
  7. print("args:",value)
  8. fun_args1("Python")
  9. # fun_args1() # 报错,提示需要传递1个参数
  10. # fun_args1("abc","111") # 报错,提示只要1个参数,而传递了2个参数
  11. fun_args2(1,2)
  12. # fun_args2(1) # 报错,提示需要2个参数,只传递了1个参数
  13. # 可以传递任意个数的参数
  14. fun_var_args("aaa")
  15. fun_var_args("aaa","bbb")
  16. fun_var_args("aaa","bbb","ccc")
  17. fun_var_args()

执行结果:
03 . 函数定义与调用 & Python类与对象 - 图1

4.参数设定方法

  • 顺序传入:调用函数时传参,实参与形参顺序对应一致
  • 关键词传入:调用函数时在参数中指定关键词(给某个参数赋值)
  • 默认参数:定义方法时提前设置好参数
  • 不定长参数:传入的参数个数不受限制
  1. # 不定长参数可封装成一个元组形式
  2. def add(*args):
  3. sum=0
  4. for i in args:
  5. sum=sum+i
  6. return sum
  7. # 调用函数
  8. a=add(1,2)
  9. b=add(1,2,3,4,5,6)
  10. print(a,b)

03 . 函数定义与调用 & Python类与对象 - 图2

二、Python类与对象

1.类与对象

对象:现实世界中万物皆对象,是事物存在的实体,即类的具体表现 :类是对象的抽象集合,如人类、汽车、动物、水果这些都是一个抽象的类别

【举例】水果(类)——苹果、葡萄、桃子(对象)

  1. 人(类)
  2. 属性:地域、肤色、国家...
  3. 功能:走路、思考、饮食、繁衍...
  4. 具体对象:中国人、美国人...
  1. 学生(类)
  2. 属性:姓名、学号、城市、年龄...
  3. 功能:听、说、读、写...
  4. 具体对象:Jack童鞋、Harry童鞋...

2.面向对象编程

OOP(Object Oriented Programming),是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数(方法)。
面向对象的设计思想来源于自然界,类(class)是一种抽象概念,比如我们定义的Student类,是指学生这个概念;而实例(Instance)则是作为个体的Student对象。
面向对象-三大特性:封装、继承、多态。

3.Python类与对象

1)创建一个类
  1. class 类名(object):
  2. 类体

class:是定义类的关键词
类名:通常是大写开头的单词(如:Student)
(object):表示该类是从object类继承下来的;若未明确的继承类,则默认就是继承object类,这是所有类最终都会继承的类,即基类。

2)对属性初始化

类可以起到模板的作用,可在创建实例对象的时候,把一些我们认为必须绑定的属性强制填写进去。
【案例】通过定义一个特殊的__init__方法,比如在创建Student实例的时候,就把name,city等属性绑上去:
(PS:此处init前后的符号分别都是2个下划线组成,不是只有1个下划线)

  1. # 创建一个类
  2. class Student():
  3. # 初始化方法
  4. def __init__(self,name,city):
  5. self.name = name # 实例变量(属性)
  6. self.city = city
  7. print("My name is %s and come from %s" %(name,city))

__init__方法的第一个参数永远是self,表示创建的实例本身。因此在__init__方法内部,可把各种属性绑定到self,self就指向所创建的实例本身。
② 有个__init__方法,在创建实例的时候,就不能传入空的参数,必须传入与__init__方法匹配的参数,但self参数不需要单独传入,Python解释器默认会把实例变量传进去。

3)定义不同的方法

类的方法除了第一个参数是self之外,其他和普通函数一样

  1. # 创建一个Student类
  2. class Student():
  3. type="学生" # 类变量
  4. # 初始化方法
  5. def __init__(self,name,city): # self表示当前对象
  6. self.name = name # 实例变量(属性)
  7. self.city = city
  8. print("My name is %s and come from %s" %(name,city))
  9. # 普通方法:talk()方法
  10. def talk(self):
  11. print("Hi, girls and boys !")
  12. # 普通方法:write()方法
  13. def write(self,year):
  14. print(year,self.name,"学习Python")
  15. # 实例化对象;当前对象为:stu
  16. # 隐式传递了self,相当于传递的是3个参数
  17. stu=Student("Caddy","Chongqing")
  18. print(stu.city)
  19. stu.city="Shanghai" # 修改属性
  20. print(stu.city)
  21. # 调用方法
  22. stu.talk()
  23. stu.write(2019)

03 . 函数定义与调用 & Python类与对象 - 图3

4)生成类的实例对象,进行调用方法

要调用方法,只需要在实例变量上直接调用

# 生成类的实例对象(传入初始化方法中的参数,不包括self)
stu = Student('Jack','Beijing')
# 通过实例变量调用talk()方法
stu.talk()

备注:

1)实例化对象时,默认会调用初始化方法init()
2)实例化对象时,隐式传递了self
3)self在初始化方法中表示当前对象,即实例化的对象
4)在初始化方法中 self.name=name,等号左边self后的name为定义的实例变量,等号右边的name为传入的参数值(该值可修改为其他名称)

三、面向对象三大特性:封装、继承、多态

1.类的封装

对类中的属性进行封装,变为私有属性,常规情况只能在类的内访问;对类中的方法进行封装,变为私有方法。从外部访问私有属性or私有方法时,需要进行相关的验证。
私有方式:在属性名or方法名之前加上2个下划线__

# 创建银行卡的类:Card类
class Card():
    # 初始化方法
    def __init__(self,num,pwd,bal):
        self.num=num    # 卡号
        self.pwd=pwd    # 密码
        self.__bal=bal  # 余额(私有属性,只能在类的内部被访问)

    def deposit(self):
        print("存款")
    def getBal(self,inputNum,inputPwd):
        # 安全验证
        if inputNum==self.num and inputPwd==self.pwd:
            return self.__bal
        else:
            return "输入错误"
# 实例化对象;当前对象:card
card=Card("1001","111",100) # 开卡
bal=card.getBal("1001","111")   # 通过验证获取余额
# bal=card._Card__bal   # 绕过验证直接获取私有属性的值
print(bal)

PS:
以上利用非常规方式,可以绕过安全验证而直接获取到敏感数据,如:`实例化的对象.
类名_私有属性名`,故不建议使用Python应用在安全级别要求高的应用程序中

2.类的继承

类的继承,会继承父类的属性、方法,对父类属性和方法进行调用

class Animal(object):   # Animal类继承object类
    def __init__(self,color):
        self.color=color
    def eat(self):
        print("动物在吃草")
    def run(self):
        print("动物在奔跑")
class Cat(Animal):  # Cat类继承Animal类
    pass
# 实例化对象时,默认调用父类的__init__()方法,故需要传入初始化方法的参数
cat=Cat("grey")
print(cat.color)    # 调用继承的属性
cat.eat()   # 调用继承的方法
cat.run()

03 . 函数定义与调用 & Python类与对象 - 图4
父类与子类调用优先级:
① 实例化对象时,优先调取子类中的初始化方法,若子类没有该方法,再到其父类中寻找初始化方法
② 调用同名方法时,先在子类中寻找,若未找到,再到父类中寻找

class Animal(object):   # Animal类继承object类
    def __init__(self,color):
        self.color=color
    def eat(self):
        print("动物在吃草")
    def run(self):
        print("动物在奔跑")
class Cat(Animal):  # Cat类继承Animal类
    pass
class Pig(Animal):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def eat(self):
        print("小猪在吃菜")
# 实例化对象时,优先调取子类中的初始化方法,若子类没有该方法,再到其父类中寻找初始化方法
pig=Pig("PQ",2)
pig.eat()   # 调用同名方法时,先在子类中寻找,若无,再到父类中寻找
pig.run()

03 . 函数定义与调用 & Python类与对象 - 图5
在子类中调用父类的初始化方法:
在子类初始化方法中写上 super(子类名,self).__init__(父类初始化方法的参数),其中super表示父类

class Animal(object):   # Animal类继承object类
    def __init__(self,color):
        self.color=color
    def eat(self):
        print("动物在吃草")
    def run(self):
        print("动物在奔跑")
class Cat(Animal):  # Cat类继承Animal类
    pass
class Pig(Animal):
    def __init__(self,name,age,color):
        super(Pig,self).__init__(color) # 在子类中调用父类的初始化方法;super为父类
        self.name=name
        self.age=age
    def eat(self):
        print("小猪在吃菜")
pig=Pig("PQ",2,"grey")
print(pig.color)

03 . 函数定义与调用 & Python类与对象 - 图6

3.类的多态

一个类/对象拥有多种形态,当不同的类中都有相同名称的方法时,每个对象可分别调用归属各自的同名方法

class Animal(object):   # Animal类继承object类
    def __init__(self,color):
        self.color=color
    def eat(self):
        print("动物在吃草")
    def run(self):
        print("动物在奔跑")
class Cat(Animal):  # Cat类继承Animal类
    def eat(self):
        print("小猫在吃鱼")
class Pig(Animal):
    def __init__(self,name,age,color):
        super(Pig,self).__init__(color) # 在子类中调用父类的初始化方法;super为父类
        self.name=name
        self.age=age
    def eat(self):
        print("小猪在吃菜")
# 多态:每个对象分别调用各自的同名方法
def feed(obj):
    obj.eat()
animal=Animal("white")
cat=Cat("yellow")
pig=Pig("小猪",2,"grey")
feed(animal)
feed(cat)
feed(pig)

03 . 函数定义与调用 & Python类与对象 - 图7


2人點贊

Selenium+Python

作者:Fighting_001
链接:https://www.jianshu.com/p/bb8d467030e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。