1.python 特点
a.解释型语言【类似于php,开发过程中没有了编译环节,直接运行】
b.交互式语言【可以在终端直接编程】
c.面向对象语言【面向对象语言的三大特征:封装,继承,多态,类和对象是面向对象的核心】
d.跨平台语言【可以运行在windows,Linux等不同的平台上】
e.动态数据类型的语言【给变量重新赋值,可以修改变量的值,可以修改变量的类型】
3》优缺点【面试题】
优点:
a.易于学习【语法比较简化】
b.易于维护【项目在进行版本更新迭代的时候节约开发成本】
c.可移植性【跨平台】
d.可扩展性【如果需要运行一段比较关键的代码或者想要编写一些不愿开发的算法,可以通过c或者c++完成,在Python代码中进行调用】
e.标准库【工具,Python中实现了模块,只需要根据需求进行调用】
f.GUI【图形化界面,实现小游戏】
g.可嵌入式【可以将Python嵌入到c或者c++中,可以让程序拥有脚本的功能】
缺点:
a.运行速度慢【和c语言相比,Python是解释性语言,代码在执行的过程中会一行一行翻译成cpu能够识别的机器码】,这个翻译的过程耗时
b.代码不能加密【如果要发布Python程序,实际上发布的是源代码】
2.短路原则【面试题】:
a.A and B,如果A为False,不需要计算B的值,整个表达式的结果为False
b.A or B,如果A为True,不需要计算B的值,整个表达式的结果为True
c.and和or混合使用
1》表达式从左往右进行计算,如果or的左边为True,则会短路or后面所有的表达式【不管后面的表达式是and还是or连接】,整个表达式的结果为True
2》 表达式从左往右进行计算,如果and的左边为False,则短路后面所有的and,直到or出现,接着计算
3》如果or的左边为False,或者and的左边为True,则不能使用短路原则
3.break和continue【面试题】
break:表示直接跳出最近的循环【就近原则】
continue:表示结束当前正在执行的循环,继续下一次循环
4.向列表中存储数据,需要考虑列表的容量吗?
工作原理:将数据存在倒列表中,不需要考虑列表的容量,列表是一种可变的数据类型,在数据量大的情况下,列表的底层会进行自动的扩容,列表的底层维护了一个栈结构【链表:存储数据的一种方式】,抽象成一个开口向上的容器
栈:先进后出,后进先出,append():向栈中添加元素,pop():从栈中删除数据
5.append 和extend之间的区别
相同点:
a.都表示在列表的末尾添加元素
b.添加多个元素,append和extend必须以容器的方式添加
不同点:
a.添加单个元素,append可以直接添加,extend只能通过容器的方式添加
b。当以容器的方式添加元素的时候,append将整个容器作为整体添加,extend只添加元素
6.拷贝面试题练习见老师copydemo代码
copy():拷贝的是列表中的地址。一维的情况下,改的是指向;二维的情况下,不改指向,改的是指向的内容。
结论:
结论:=表示引用赋值,当一个列表中的元素被修改之后,另一个列表也会随着被修改
copy:如果是一维列表,则修改一个列表对另一个列表没有影响,但是如果是一个二维列表,如果修改二维列表,另一个列表也会随着被修改
注意:不管一维还是二维列表,其中存储的实际上都是地址
copy 模块中的copy
"""
深浅拷贝
一维列表:不管是copy还是deepcopy,一个列表被修改,另一个列表不受影响
二维列表:
copy:一个列表修改二维列表,另一个随着修改【只拷贝外层】
deepcopy:一个列表被修改,另一个列表不受影响【全部拷贝】
"""
7.采用不同的方式交换两个变量的值
num1 = 10
num = 20
#方式一:
num1,num2 = num2,num1
print(num1,num2)
#方式二:定义一个中间变量
num1 = 10
num2 = 20
temp = num1
num1 = num2
num2 =temp
print(num1,num2)
#方式三:加减法
num1 = 10
num2 = 20
num1 = num1 + num2 #10+20
num2 = num1 - num2
num1 = num1 - num1
print(num1,num2)
#方式四:异或
num1 = 10
num2 = 20
num1 = num1 ^ num2
num2 = num1 ^ num2
num1 = num1 ^ num2
print(num1,num2)
8.元组的修改
2019.6.25 Day6
9…采用不同的方式获取1~100之间的随机数【面试题】
import random
num1 = random.choice(range(1,101))
num2 = random.randint(1,100)
num3 = random.randrange(1,101)
num4 = random.random() * 100 + 1
num5 = random.uniform(1,100)
10.list和tuple之间的区别和联系,见课堂默写
"""
相同点:
a.都是用来存储多个数据的数据结构
b.都可以存储不同类型的数据
c.都可以存储重复数据
d.都是有序的,都可以通过索引遍历二者
不同点:
a.list是可变的,tuple是不可变的
b.tuple在创建时间和内存空间上优于list的
"""
:
11.set中的add和update的区别list中append和extend相同
12.冒泡排序
排序思路:比较两个相邻下标对应的元素,如果符合条件则交换位置
#冒泡排序,以升序为例
list1 = [3,54,1,3,645,632,23,345]
#外层循环:控制比较的轮数
for i in range(len(list1) - 1):
#内层循环:控制每一轮比较的次数兼顾参与比较的下标
for j in range(len(list1) - i - 1):
#小下标对应的元素 > 大下标对应的元素
if list1[j] > list1[j + 1]:
list1[j],list1[j + 1] = list1[j + 1],list1[j]
print(list1)
"""
问题:
索引越界:IndexError: list index out of range
原因:
以5个元素为例,下标0~4
for i in range(len(list1) - 1)的取值范围为0~3
for j in range(len(list1) - i)
len(list1) - i,当i = 0,len(list1) - i = 5,range(5),j取值范围为0~4,j + 1的取值范围为1~5
解决:
for j in range(len(list1) - i- 1)
"""
13.选择排序
排序思路:固定一个下标,然后用该下标对应的元素和列表中的其他元素进行依次比较,如果符合条件则交换位置
#选择排序,以升序为例 list1 = [3,54,1,3,645,632,23,345] #外层循环:控制比较的轮数 for i in range(len(list1) - 1): #内层循环:控制每一轮比较的次数兼顾参与比较的下标 for j in range(i + 1,len(list1)): if list1[i] > list1[j]: list1[i],list1[j] = list1[j],list1[i] print(list1)
14.值传递和引用传递【面试题】
"""
不可变数据类型:tuple,number,string,boolean
可变数据类型:list,dict,set
"""
#1.值传递,实际上传递的是不可变数据类型
def func1(a):
print("修改之前a=%d,地址:%d" % (a,id(a)))
a = 20
print("修改之后a=%d,地址:%d" % (a,id(a)))
b = 10
print("调用函数之前,b=%d,地址:%d" % (b,id(b)))
func1(b) #a = b
print("函数调用完毕,b=%d,地址:%d" % (b,id(b)))
print("over")
"""
调用函数之前,b=10,地址:1588438400
修改之前a=10,地址:1588438400
修改之后a=20,地址:1588438720
函数调用完毕,b=10,地址:1588438400
over
"""
#2.引用传递,传递的是可变的数据类型
def func1(a):
print("修改之前a=%s,地址:%d" % (a,id(a)))
a[0] = 1111
print("修改之后a=%s,地址:%d" % (a,id(a)))
b = [10,20,30,40]
print("调用函数之前,b=%s,地址:%d" % (b,id(b)))
func1(b) #a = b
print("函数调用完毕,b=%s,地址:%d" % (b,id(b)))
"""
调用函数之前,b=[10, 20, 30, 40],地址:35700040
修改之前a=[10, 20, 30, 40],地址:35700040
修改之后a=[1111, 20, 30, 40],地址:35700040
函数调用完毕,b=[1111, 20, 30, 40],地址:35700040
"""
"""
函数传参的过程中,
值传递:如果形参被修改,对实参没有任何影响
引用传递:如果形参被修改,则实参会随着被修改
"""