14.函数
def calc(a ,b):'''创建'''
c=a-b
return c;
calc1 = calc(10, 20)'''调用'''
calc2 =calc(b=50,a=60)
print(calc1)
print(calc2)
在函数调用过程中,进行参数的传递
如果是不可变对象,在函数体的修改不会影响实参的值 arg1的修改为100,不会影响n1的值
如果是可变对象,在函数体的的修改会影响到实参的值arg2的修改,append(10),会影响到n2的值
函数的返回值
(1)如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】return可以省略不写
(2)函数的返回值,如果是1个,直接返回类型
(3)函数的返回值,如果是多个,返回的结果为元组
可以查看print
print(self, *args, sep=' ', end='\n', file=None)
end 默认换行
- 个数可变的位置参数
def p(*args):
print(args)
#print(args[0]) #作为一个元组来使用
p(20,20,30)
p(20)
lst=[10,20,30]
p(*lst) #在函数调用时,将列表中的每个元素都转换为位置实参传入
#(20, 20, 30)
#(20,)
#(10, 20, 30)
#eg:
print(self, *args, sep=' ', end='\n', file=None)
位置参数
- 个数可变的关键字参数
def fun(** args):
print(args)
fun(a=10)
fun(a=20,b=30,c=60)
dic={'a':111,'b':222,'c':333}
fun(**dic)#在函数调用时,将字典中的键值对都转换为关键字实参传入
#{'a': 10}
#{'a': 20, 'b': 30, 'c': 60}
#{'a': 111, 'b': 222, 'c': 333}
以上两个个数可变的参数一个函数只能定义一个
两个同时使用时,要求 个数可变的位置参数 在 个数可变的关键字参数之前
如果不加* 三种方法都可以
15.类
1)创建语法
class Student:
pass
print(id(Student)) #已经开辟空间了
print(type(Student))
print(Student)
'''
2450633353136
<class 'type'>
<class '__main__.Student'>
'''
定义在类里的函数就是
2)实例调用
创建的实例对象中 会有一个类指针指向类
- 对象名.方法名
- 类名.方法名(类的对象)#就是定义处的self
- 类属性
- 类方法
类方法和静态调用:
Studet.cm() #cls是不需要传入的
Studet.method()
3)动态绑定属性与方法
python是动态语言,创建对象后可以动态绑定属性与方法
- 动态绑定属性
eg:对象添加一个属性
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(self.name+'在吃饭')
stu1=Student('张三',20)
stu1.gender='女'
print(stu1.gender,stu1.name,stu1.age)
- 动态绑定方法
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(self.name+'在吃饭')
def show():
print("定义在类外的 称为方法")
stu1.s=show()
stu1.s
4) 封装,继承,多态
- python没有修饰符来标识属性的私有 可以使用两个 _
只有内部可以访问,外部不能访问
(靠程序员的自觉)
-
默认继承object类
class Animal(object):
后面的括号写父类
子类和父类有同名方法时 子类覆盖父类
- 判断一个变量是否是某个类型及父继承链
isinstance(c, Dog) #与Java类似
-
开闭原则
-
对扩展开放
可以新增子类继承父类,覆盖父类的方法
-
对修改封闭
不可以修改 依赖父类的类型(父类类型做传入参数)的方法
-
16.模块
.py结尾的文件 就可以作为模块
包中有模块
- 代码复用
- 分工合作开发
- 避免命名重复
- 常用内置模块
- sys
- time
- os
- calendar(日期相关各种函数标准库)
- urllib(读取服务器的数据标准库)
- json
- re
- math
- decimal
- logging
- 导入第三方包
17.包
Python中的包
-
包是一个分层次的目录结构,它将一组功能相近的模块组织在一起
-
作用
代码规范
避免模块名称冲突·
-
包与目录的区别
包含__init_ .py文件的目录称为包·目录里通常不包含_init_.py文件
心 -
包的导入
import包名.模块名 as 别名 -
使用from…import 可以导入包,模块,函数,变量
内置函数
1.isinstance
有时候可以代替type()
判断它是不是 某个类的对象
判断是不是 多个类其中一个的对象
isinstance('a', str)
isinstance([1, 2, 3], (list, tuple))
True
isinstance((1, 2, 3), (list, tuple))
True
2.dir()
获取一个对象的所有属性和方法
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
#__add__ 命名的是有特殊用途的 比如__len__方法返回长度
>>> hasattr(obj, 'x') # 有属性(方法和变量)'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19