一、继续学习函数
嵌套函数(内部函数):
一般在什么情况下使用嵌套函数? 1. 封装 - 数据隐藏 外部无法访问“嵌套函数”。 2. 贯彻 DRY(Don’t Repeat Yourself) 原则 嵌套函数,可以让我们在函数内部避免重复代码。 3. 闭包 后面会详细讲解。def printChineseName(name,familyName):
print("{0} {1}".format(familyName,name))
def printEnglishName(name,familyName):
print("{0} {1}".format(name, familyName))
#使用 1 个函数代替上面的两个函数
def printName(isChinese,name,familyName):
def inner_print(a, b):
print("{0} {1}".format(a, b))
if isChinese:
inner_print(familyName, name)
else:
inner_print(name, familyName)
printName(True,"小七","高")
printName(False,"George","Bush")
nonlocal 关键字
nonlocal 用来声明外层的局部变量。
global 用来声明全局变量。
#测试 nonlocal、global 关键字的用法
a = 100
def outer():
b = 10
def inner():
nonlocal b #在内部函数中声明外部函数的局部变量
print("inner b:",b)
b = 20
global a#声明全局变量
a = 1000
inner()
print("outer b:",b)
outer()
print("a:",a)
LEGB规则
Python 在查找“名称”时,是按照 LEGB 规则(顺序)查找的: Local-->Enclosed-->Global-->Built in Local 指的就是函数或者类的方法内部(最内层函数) Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包) Global 指的是模块中的全局变量 Built in 指的是 Python 为自己保留的特殊名称。#测试LEGB
str = "global"#前两个不存在时才奏效
def outer():
str = "outer"
def inner():
str = "inner"#最先奏效
print(str)
inner()
outer()
二、面向对象(Python支持的主要编程方式)
面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式更加接近人的思维,从而大大提高了编程的效率。 面向过程(找动词):适合简单的小规模问题。eg:1. 发动车 2. 挂挡 3.踩油门 4. 走你 面向对象(找名词):适合编写大规模程序面向对象方式造车,宏观分解问题,达到底层之后会使用面向过程。 对象的进化:简单数据、数组、结构体(各种数据结构就是用结构体定义的)、对象(数据以及处理数据的方法) 类的定义:对象是饼干,那类就是制作饼干的模具。#类的熟悉
class Student:
def __init__(self,name,score):#初始化,self表示对象自己,self存该对象的地址
#构造方法第一个参数必须为 self
self.name = name #实例属性 s
self.score = score
def say_score(self): #实例方法 self必须加
print(self.name,'的分数是:',self.score)
s1 = Student('张三',80)
s1.say_score()
class Student:
def __init__(self,name,score):
#构造方法第一个参数必须为 self
self.name = name #实例属性 (初始值)
self.score = score
def say_score(self): #实例方法 self必须加
print(self,self.name,'的分数是:',self.score)
s1 = Student('张三',80)
s1.say_score()
print(dir(s1))
print(s1.__dict__)#直观的有的东西
函数和方法的区别:
1、本质一样;2、方法调用时,通过对象来调用。方法从属于特定的实例对象,普通函数没有这个特点;3、直观上看,方法定义需要self
__init__()和__new__()方法
__init__()方法:初始化创建好的对象,初始化指的是:“给实例属性赋值” __new__()方法: 用于创建对象,但我们一般无需重定义该方法类对象
class Student:#创建了一个类对象
company = "UESTC" #类属性
count = 0
def __init__(self,name,score):
self.name = name
self.score = score
Student.count = Student.count+1 #计数器,每创建一个类对象就加一
def say_score(self):
print("公司是:",Student.company)
print(self.name,'的分数是:',self.score)
s1 = Student('我',90)
s1.say_score()
print(type(Student))
print('一共创建{0}个 Student 对象'.format(Student.count))
print(id(Student))
Stu2 = Student
s1 = Stu2()
print(s1)
print(id(s1))
class Student:
company = "SXT" # 类属性
@staticmethod
def add(a, b): # 静态方法
print("{0}+{1}={2}".format(a,b,(a+b)))
return a+b
Student.add(20,30)
#析构方法
class Person:
def __del__(self):
print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")



