函数
- 定义:具有相对独立功能的模块
- 定义函数的意义:这样做的好处一是减少重复代码的编写,二是将来可以重复的使用这些功能模块
- 关键字 def
- 函数的命名规则和变量命名是一样的
- 格式:
#main是函数名,(参数) def main(): rerurn #通过下面的if条件可以在导入模块时不执行下面的代码 if __name__ = '__main__': main()
- 定义求阶乘的函数 - 将求阶乘的功能抽取出来放到函数中
"""
给定义的函数添加注释
"""
def factorial(x):
"""
计算阶乘
:param x: 一个非负整数
:return: x的阶乘
"""
y = 1
for num in range(1, x + 1):
y *= num
return y
#通过下面的if条件可以在导入模块时不执行下面的代码
if __name__ == '__main__':
- 当需要计算阶乘的时候不用在写循环而是直接调用已经定义好的函数
- 在设定函数的时候如果不知道参数的个数的话,就可以用*(可变参数)
def f(*args):
total = 0
for val in args:
total += val
return total
- 函数不能直接调用列表参数,如果要调用列表参数,通过*把列表里的元素一个个的传递给函数并执行
my_list = [1, 3 , 5 , 7]
print(f(*my_list)
a = 100
def f():
global a
a = 200
b = 'hello'
def f():
nonlocal b# 嵌套
b = 'good'
- 函数的递归调用:函数直接或者间接的调用的行为就是递归调用
模块 - 一个文件就是一个模块
- 关键字 import from ...import import...as
字符串
- 由零个或者多个字符组成的有限序列
我们可以通过下面的代码来了解字符串的使用:
def main():
str1 = 'hello, world!'
# 通过len函数计算字符串的长度
print(len(str1)) # 13
# 获得字符串首字母大写的拷贝
print(str1.capitalize()) # Hello, world!
# 获得字符串变大写后的拷贝
print(str1.upper()) # HELLO, WORLD!
# 从字符串中查找子串所在位置
print(str1.find('or')) # 8
print(str1.find('shit')) # -1
# 与find类似但找不到子串时会引发异常
# print(str1.index('or'))
# print(str1.index('shit'))
# 检查字符串是否以指定的字符串开头
print(str1.startswith('He')) # False
print(str1.startswith('hel')) # True
# 检查字符串是否以指定的字符串结尾
print(str1.endswith('!')) # True
# 将字符串以指定的宽度居中并在两侧填充指定的字符
print(str1.center(50, '*'))
# 将字符串以指定的宽度靠右放置左侧填充指定的字符
print(str1.rjust(50, ' '))
str2 = 'abc123456'
# 从字符串中取出指定位置的字符(下标运算)
print(str2[2]) # c
# 字符串切片(从指定的开始索引到指定的结束索引)
print(str2[2:5]) # c12
print(str2[2:]) # c123456
print(str2[2::2]) # c246
print(str2[::2]) # ac246
print(str2[::-1]) # 654321cba
print(str2[-3:-1]) # 45
# 检查字符串是否由数字构成
print(str2.isdigit()) # False
# 检查字符串是否以字母构成
print(str2.isalpha()) # False
# 检查字符串是否以数字和字母构成
print(str2.isalnum()) # True
str3 = ' [email protected] '
print(str3)
# 获得字符串修剪左右两侧空格的拷贝
print(str3.strip())
if __name__ == '__main__':
main()
列表
- 由零个或者多个元素构成的有限序列
下面的代码演示了如何定义列表、使用下标访问列表元素以及添加和删除元素的操作
def main():
f = [100, 200, 500]
for index ,val in enumerate(f):#枚举
print(index, ':', val)
#CRUD操作(Create Read Update Delete)
f.append(300)#追加元素,放在最后
f.insert(0, 400)#指定位置添加元素
if 500 in f:#不知道是否有这个元素,就用if - in 判断再删除
f.remove(500)#删除元素
del f[3]#如果知道这个元素的位置,直接用del删除
#print(f.index(100, 3 , 5))#如果在该范围内没有100这个元素,程序就会报错
#f.clear()#清空列表中的元素
print(f.pop())#默认删除最后一个元素,如果在给定范围没有元素,程序就会报错
print(f)
if __name__ == '__main__':
main()
我们还可以使用列表的生成式语法来创建列表,代码如下所示。
import sys
# 时间和空间是不可调和的矛盾
# 软件和硬件在逻辑上是等效的
def main():
f = list(range(1,10))
print(f)
#列表生成式语法: 用列表的生成表达式语法创建列表容器
#用这种语法创建之后元素已经准备就绪,所以需要耗费较多的空间
f = [x for x in range(1, 10)]
f2 = [x ** 2 for x in range(1,100)]
f3 = [x ** x for x in range(1,10)]
print(f)
print(f2)
print(sys.getsizeof(f2))#getsizeof这个函数查看对象占得内存
print(f3)
#列表生成器(generator)语法:这里得到的不是一个列表,而是一个生成器对象
#通过生成器可以获取到数据,他不占用额外的空间存储数据
#每次需要数据的时候通过生成器获取数据,所以要耗费更多的时间
f = (x ** 2 for x in range(1,100))
print(f)
print(sys.getsizeof(f))
# for val in f:
# print(val)
if __name__ == '__main__':
main()
def main():
f = [x+y for x in 'ABCDE' for y in '1234567']
print(f)
if __name__ == '__main__':
main()
元组
- Python 的元组与列表类似,不同之处在于元组的元素不能修改,在前面的代码中我们已经不止一次使用过元组了。顾名思义,我们把多个元素组合到一起就形成了一个元组,所以它和列表一样可以保存多条数据。下面的代码演示了如何定义和使用元组
def main():
# 定义元组
t = ('Kyle', 23, True, '四川成都')
print(t)
# 获取元组中的元素
print(t[0])
print(t[3])
# 遍历元组中的值
for member in t:
print(member)
# 重新给元组赋值
# t[0] = 'Kris' # TypeError
# 变量t重新引用了新的元组原来的元组将被垃圾回收
t = ('Kris', 20, True, '河南郑州')
print(t)
# 将元组转换成列表
person = list(t)
print(person)
# 列表是可以修改它的元素的
person[0] = '李小龙'
person[1] = 25
print(person)
# 将列表转换成元组
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list)
print(fruits_tuple)
if __name__ == '__main__':
main()
集合
Python中的集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算
def main():
set1 = {1, 2, 3, 3, 3, 2}
print(set1)
print('Length =', len(set1))
set2 = set(range(1, 10))
print(set2)
set1.add(4)
set1.add(5)
set2.update([11, 12])
print(set1)
print(set2)
set2.discard(5)
# remove的元素如果不存在会引发KeyError
if 4 in set2:
set2.remove(4)
print(set2)
# 遍历集合容器
for elem in set2:
print(elem ** 2, end=' ')
print()
# 将元组转换成集合
set3 = set((1, 2, 3, 3, 2, 1))
print(set3.pop())
print(set3)
# 集合的交集、并集、差集、对称差运算
print(set1 & set2)
# print(set1.intersection(set2))
print(set1 | set2)
# print(set1.union(set2))
print(set1 - set2)
# print(set1.difference(set2))
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 判断子集和超集
print(set2 <= set1)
# print(set2.issubset(set1))
print(set3 <= set1)
# print(set3.issubset(set1))
print(set1 >= set2)
# print(set1.issuperset(set2))
print(set1 >= set3)
# print(set1.issuperset(set3))
if __name__ == '__main__':
main()
字典
字典是另一种可变容器模型,类似于我们生活中使用的字典,它可以存储任意类型对象,与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。下面的代码演示了如何定义和使用字典
def main():
dict1 = {'name': 'Kyle', 'age': 23, 'gender': True}
# 通过键可以获取字典中对应的值
print(dict1['name'])
print(dict1['age'])
print(dict1['gender'])
# 对字典进行遍历(遍历的其实是键再通过键取对应的值)
for x in dict1:
print('%s\t--->\t%d' % (x, dict1[x]))
# 更新字典中的元素
dict1['Eric'] = 65
dict1['Angel'] = 71
dict1.update(Musk=67, Jobs=85)
print(scores)
if 'Tesla' in dict1:
print(dict1['Tesla'])
print(dict1.get('Tesla'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(dict1.get('Tesla', 60))
# 删除字典中的元素
print(dict1.popitem())
print(dict1.pop('Kyle', 100))
# 清空字典
dict1.clear()
printdict1)
if __name__ == '__main__':
main()
内存管理
栈 - 地址 - 对象的引用
堆 - 真正的对象
id()函数和is运算符(寻找对象的地址和变量名是否引用同一地址的方法) - 验证身份
静态区
面向对象的编程的基础
#Step 1, 定义类
#类是对象的蓝图和模板,有了类就可以创建对象
#定义类需要做两件事情,数据抽象和行为抽象
#数据抽象 - 抽取对象共同的静态特征(找名词) - 属性
#行为抽象 - 抽取对象的共同的动态特征(找动词)- 方法
#定义类的关键字 - class - 类名(每个单词的首字母都要大写)
class Student(object):
#构造方法(构造器/构造子 - constructor)
#调用方法的时候不是直接使用方法的名字而是使用类的名字
def __init__(self,name, age):
#给对象绑定属性
self.name = name #给对象添加行为之前给对象添加name,age属性
self.age = age
#我们定义一个方法就代表了对象可以接受这个消息
#对象的方法的第一个参数都是统一写成self
#它代表了接收消息的对象 - 对象.消息(参数)
def study(self, course): #在类里面给对象定义的函数叫做方法
print('%s正在学习%s' % (self.name, course)) #行为
def watch_tv(self):
if self.age >= 18:
print('%s正在观看cctv5' % self.name)
else:
print('%s,我们推荐你看《熊出没》' % self.name)
def main():
#Step2 - 调用构造方法创造学生对象,实际使用的是__init__方法
stu1 = Student('Kyle', 23)#创造对象
#Step 3 给对象发出消息
#通过给对象发消息让对象完成某些工作
#解决任何的问题都是通过让对象去做事情
stu1.study('Python程序设计')
stu2 = Student('Kris', 16)
stu2.study('英语')
stu2.age = 19
stu2.name = 'Kris'
stu2.watch_tv()
if __name__ == '__main__':
main()