参考资料:DataWhale 专业课本《Python程序设计》
运行环境:Anaconda+Sublime Text3
本章为python基础知识。首先理解python中的一切都是对象
python内置对象有:
数字 | 1234 | 不可变 |
字符串 | ‘abcd’ | 不可变 |
列表 | [1,2,3] | |
字典 | {1:'food',2:'taste'} | |
元组 | (0,1,2) | 不可变 |
文件 | f=open('data.txt','r') | |
集合 | set('abc'),{'a','b','c'} | |
布尔型 | True,False | |
空类型 | None | |
编程单元类型 | 函数:def定义 类:class定义 |
运算符挑一些不熟悉的记录一下
x in y; x not in y | 成员测试运算符 |
x is y; x is not y | 对象实体同一性测试 |
|、^、&、<<、>>、~ | 位运算符 |
&、|、^ | 集合交集、并集、对称差集 |
@ | 矩阵乘法 |
位运算符: 计算机内部使用补码表示二进制
数据类型转换
转换为整型int(x,base=10)
转换为字符串str(object='')
转换为浮点型float(x)
首先弄清楚计算机的原码、反码、补码。
接下来了解位运算符是如何改变数据的补码
位与操作&只有两个对应位都为1时才为1
位或操作|只要两个对应位中有一个1时就为1
位异或操作^只有两个对应位不同时才为1
位左移a<
位右移a>>i表示a的二进制向右移动i位所得的值
位运算应用
1.利用位运算实现快速计算
leetcode 习题 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元
素。
尝试使用位运算解决此题。
只有一位数字出现一次,且其他数字都出现两次很关键。异或操作时0与任何数异或为其本身,本身自异或时为0,斐波那契式异或为原数。
单元检测时可使用assert进行单元测试,只有条件为True才能让程序正常工作。
enumerate(sequence,[start=0]) 枚举对象
枚举可以实现在循环中改变输出内容的编号
break跳出当前所在层的循环
continue终止本轮循环并开始下一轮循环
循环例题练习:运用if else;elif;while;enumerate;break;continue;
练习一:为DataFrame的某一列增加同一个字符
程序异常的类型有:标准异常、标准警告
异常体系内部有层次关系:
按模块检测程序错误使Debug 更高效,便于后期维护。
一个try 语句可能包含多个except 子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
try-except-finally和try-except-else
不管try子句里面有没有发生异常,finally子句都会执行。
如果一个异常在try子句里被抛出,而又没有任何except把它截住,那么这个异常会在finally子句执行后被抛出。
练习题:
1、猜数字游戏
题目描述:
电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示
太小,当用户正好猜中电脑会提示,"恭喜你猜到了这个数是......"。在用户每次猜测之前程序会输出用户是第几次猜
测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。
(尝试使用try catch异常处理结构对输入情况进行处理)
获取随机数采用random模块。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!
# your
import random
num=random.randint(0,100)
guess=input("you guess num:")
try:
if guess >num:
print("bigger")
elif guess
简单数据类型:整型、浮点型、布尔型
容器数据类型:列表、元组、字典、集合、字符串
x=['a','b','c','d']
print(x,type(x))
x1=[1,2,3,4]
print(x1,type(x1))
x2=[0]*5#列表推导式创建列表
print(x2,type(x2))
x3=[0 for i in range(5)]
print(x3,type(x3))
x4=[i for i in range(10)]
print(x4,type(x4))
x5=[i**2 for i in range(1,10)]
print(x5,type(x5))
x6=[i for i in range(100)if i%2!=0 and (i%3)==0]
print(x6,type(x6))
x7=[[1,2,3],[4,5,6],[5,6,7]]
print(x7,type(x7))
for i in x7:
print(i,type(i))
x=[[0 for col in range(3)]for row in range(4)]#生成三列四行的矩阵
print(x,type(x))
x[1][1]=1
print(x,type(x))
使用append向列表添加元素,extend扩展元素
remove移除列表中某个值的第一个匹配项,pop移除列表中的一个元素,默认为最后一个
append、extend、insert可对列表增加元素,它们没有返回值,而是直接修改了原数据对象。将两个list相加,需要创建新的list对象,从而需要消耗额外的内存,特别是当list较大时,尽量不要使用“+"来添加list
list.count(obj)统计某个元素在列表中出现的次数
list.reverse()反向列表中元素
list.sort(key=None,reverse=False)
1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
1. 在列表的末尾增加元素15
2. 在列表的中间位置插入元素20
3. 将列表[2, 5, 6]合并到lst中
4. 移除列表中索引为3的元素
5. 翻转列表里的所有元素
6. 对列表里的元素进行排序,从小到大一次,从大到小一次
lst=[2,5,6,7,8,9,2,9,9]
lst.append(15)
lst.insert(4,20)
l1=[2,5,6]
lst.extend(l1)
print(lst)
lst.remove(lst[3])
lst.reverse()
lst.sort()
lst.sort(reverse=True)
print(lst)
2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
def double_list(lst):
for index,value in enumerate(lst):
if isinstance(value,bool):
continue
if isinstance(value,(int,float)):
lst[index]*=2
if isinstance(value,list):
double_list(value)
if __name__=='__main__':
lst=[1,[4,6],True]
double_list(lst)
print(lst)
3、leetcode 852题 山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3
k[0]
这个$i$就是顶峰索引。
现在,给定一个山脉数组,求顶峰索引。
x.sort(key=lambda a: a[0])
print(x)
# [(1, 3), (2, 2), (3, 4), (4, 1)]
现在,给定一个山脉数组,求顶峰索引。
示例:
输入:[1, 3, 4, 5, 3]
输出:True
输入:[1, 2, 4, 6, 4, 5]
输出:False
enumerate和isinstance补充
isinstance()函数用于判断一个对象是否是一个已知的类型,与type()的区别如下:
语法:isinstance(object,classinfo)
参数:object为对象,classinfo可以是直接或间接类名、基本类型或者由它们组成的元组
返回值:Ture和False
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
语法:enumerate(sequence,[start=0])
元组
元组创建后不可修改,类似字符串
元组有不可更改(immutable)的性质,因此不能直接给元组的元素赋值,但可以更改元组的元素
元组可以使用切片
元组相关的操作符:比较、逻辑、连接、重复、成员关系
元组拼接:用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
解压元组
*rest和*_
练习题:
1.分析下列为什么出现这样的结果
2、拆包过程是什么?
a,b=1,2
上述过程属于拆包吗? 答:不属于,为赋值。
可迭代对象拆包时,怎么赋值给占位符?python星号(*)的作用
当函数的参数前面有一个星号*时,表示这是一个可变的位置参数,两个星号**表示是可变的关键字参数
字符串
字符串的切片与拼接
str1 = 'I Love LsgoGroup'
print(str1[:6]) # I Love
print(str1[5]) # e
print(str1[:6] + " 插入的字符串 " + str1[6:])
# I Love 插入的字符串 LsgoGroup
s = 'Python'
print(s) # Python
print(s[2:4]) # th
print(s[-5:-2]) # yth
print(s[2]) # t
print(s[-1]) # n
字符串常用内置方法
剩下的不列举啦,可查手册了解。
练习题
1、字符串函数回顾
1. 怎么批量替换字符串中的元素?
2. 怎么把字符串按照空格进⾏拆分?
3. 怎么去除字符串⾸位的空格?
str1=" xYy y Y"
print(str1.capitalize())#首字母转换为大写
print(str1.lower())#全转为小写
print(str1.upper())#全转为大写
print(str1.swapcase())#小转大,大转小
print(str1.replace('Y','hhh'))
print(str1.lstrip())
u="www fisheep com"
u1,u2,u3=u.split(" ",2)
print(u1)
print(u2)
print(u3)
2、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9
def isdigit(string):
if not string:
return False
for item in string:
if not(48<=ord(item)<=57):
return False
return True
if __name__ == '__main__':
print(isdigit('232'))
3、leetcode 5题 最长回文子串
给定一个字符串 s ,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: "babad"
输出: "bab"
输入: "cbbd"
输出: "bb"
数字、字符和元组都能被哈希,因此它们不可变
列表、集合、字典不能被哈希,因此它是可变类型
seq=('name','age','sex')
values=('1','2','3')
dic1=dict.fromkeys(seq)
print("new dict is: %s" % str(dic1))
dict2=dict.fromkeys(seq,10)
print("new dict is: %s" % str(dict2))
dict3=dict.fromkeys(seq,values)
print("new dict is: %s" % str(dict3))
lst=list(dict3.keys())
print(lst)
lst1=list(dict3.values())
print(lst1)
lst2=list(dict3.items())
print(lst2)
if 'name' in dict3:
print('exist')
dic1={1:"a",2:[1,2]}
dic={'name':'xy','sex':'male','age':22}
dic1={'1':'xyy','2':'male','3':22}
dic1.update(dic)
print("update dic: %s" % dic1)
练习题
dic = {'python': 95,'java': 99,'c': 100}
1. 字典的长度是多少
2. 请修改'java' 这个key对应的value值为98
3. 删除 c 这个key
4. 增加一个key-value对,key值为 php, value是90
5. 获取所有的key值,存储在列表里
6. 获取所有的value值,存储在列表里
7. 判断 javascript 是否在字典中
8. 获得字典里所有value 的和
9. 获取字典里最大的value
10. 获取字典里最小的value
11. 字典 dic1 = {'php': 97}, 将dic1的数据更新到dic中
dic={'python':95,'java':99,'c':100}
print(len(dic))
dic['java']=98
print(dic)
print(dic.pop('c','100'),dic)
dic1={'php':90}
dic.update(dic1)
print(dic)
print(dic.keys())
print(dic.values())
if 'javascript' in dic:
print('exist')
else:
print('error')
s=0
max1=0
temp=0
for i in dic.values():
s=s+i
if max1<=i:
temp=i
max1=temp
else:
print(max1)
print(s)
print(min(dic.values()))
2、字典中的value
有一个字典,保存的是学生各个编程语言的成绩,内容如下
data = {
'python': {'上学期': '90', '下学期': '95'},
'c++': ['95', '96', '97'],
'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
}
各门课程的考试成绩存储方式并不相同,有的用字典,有的用列表,但是分数都是字符串类型,请实现函
数transfer_score(score_dict) ,将分数修改成int类型
import pprint
def transfer_score(data):
if isinstance(data,dict):
for key,value in data.items():
data[key]=transfer_score(value)
return data
if isinstance(data,list):
data_lst=[]
for item in data:
data_lst.append(transfer_score(item))
return data_lst
if isinstance(data,str):
return int(data)
if __name__ == '__main__':
data = {
'python': {'last': '90', 'next': '95'},
'c++': ['95', '96', '97'],
'java': [{'month':'90', 'middle': '94', 'final': '98'}]
}
data=transfer_score(data)
pprint.pprint(data)
print(data['python'])
集合的创建
1. 先创建对象再加入元素。
2. 在创建空集合的时候只能使用s = set() ,因为s = {} 创建的是空字典。
3.使用set(value) 工厂函数,把列表或元组转换成集合。
由于 set 存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取
集合中元素的值,但是可以判断一个元素是否在集合中。
练习题
1. 怎么表示只包含⼀个数字1的元组。
2. 创建一个空集合,增加 {‘x’,‘y’,‘z’} 三个元素。
3. 列表['A', 'B', 'A', 'B']去重。
4. 求两个集合{6, 7, 8},{7, 8, 9}中不重复的元素(差集指的是两个集合交集外的部分)。
5. 求{'A', 'B', 'C'}中元素在 {'B', 'C', 'D'}中出现的次数。
s=(1,)
print(type(s))
newset=set()
newset.add('x')
newset.add('y')
newset.add('z')
lst=['A','B','A','B']
newset=set(lst)
print(newset)
a={6,7,8}
b={7,8,9}
print(a-b)
序列
#list(sub)把一个可迭代对象转换为列表
#tuple(sub)把一个可迭代对象转换为元组
#str(obj)把obj对象转换为字符串
#len(s)返回对象(字符、列表、元组等)长度或元素个数
a=list()
print(a)
b='I Love LS'
b=list(b)
print(b)
1. 怎么找出序列中的最⼤、⼩值?
2. sort() 和 sorted() 区别
3. 怎么快速求 1 到 100 所有整数相加之和?
4. 求列表 [2,3,4,5] 中每个元素的立方根。
5. 将[‘x’,‘y’,‘z’] 和 [1,2,3] 转成 [(‘x’,1),(‘y’,2),(‘z’,3)] 的形式。
a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
zipped=zip(a,b)
print(tuple(zipped))
print(max(a))
print(min(a))
print(sum(c))
seasons=['Spring','Summer','Fall','Winter']
a=list(enumerate(seasons))
b=list(enumerate(seasons,1))
for i,element in a:
print('{0},{1}'.format(i,element))
a=[2,4,3,6,8,2]
print(sorted(a))
a.sort()
print(a)
1. sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。
a. iterable -- 可迭代对象。
b. key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可
迭代对象中的一个元素来进行排序。
c. reverse -- 排序规则, reverse = True 降序 , reverse = False 升序(默认)。
d. 返回重新排序的列表。
2.sort方法对list排序会修改list本身,不会返回新list
参数的类型:
位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合
def argtest(name,age=9):
print('Name:{0},Age:{1}'.format(name,age))
argtest('xyy')
def test(arg1, *,nkw,**kw):
print(arg1)
print(nkw)
print(kw)
test(70,nkw=10,a=1,b=2)
变量作用域、内嵌函数
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num) # 1
num = 123
print(num) # 123
fun1()
print(num) # 123
def outer():
print('outer函数在这被调用')
def inner():
print('inner函数在这被调用')
inner() # 该函数只能在outer函数内部被调用
outer()
# outer函数在这被调用
# inner函数在这被调用
Lambda表达式
练习题
1. 怎么给函数编写⽂档?
2. 怎么给函数参数和返回值注解?
3. 闭包中,怎么对数字、字符串、元组等不可变元素更新。
4. 分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
a=[[6, 5], [3, 7], [2, 8]]
x = sorted(a, key=lambda a: a[0], reverse=False)
print("按照首元素大小正序排列:"+str(x))
x = sorted(a, key=lambda a: a[0], reverse=True)
print("按照首元素大小逆序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=False)
print("按照尾元素大小正序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=True)
print("按照尾元素大小逆序排列:"+str(x))
5. 利用python解决汉诺塔问题?有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c
柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)
def Tower_of_Hanoi(n,a,b,c):
if n == 1:
print(a, "-->", c)
return 0
Tower_of_Hanoi(n-1,a,c,b)
print(a, "-->", c)
Tower_of_Hanoi(n-1,b,a,c)
Tower_of_Hanoi(64,'A','B','C')
继承:子类自动共享父类之间数据和方法的机制
多态:不同对象对同一方法响应不同的行动
class Turtle:
color='green'
weight=10
legs=4
shell=True
mouth='big mouth'
def climb():
print("climb ya,climb")
def bite(self):
print("bite ya,bite")
class Sonclass:
"""docstring for sonclass"""
def son():
print("son methods")
tt=Turtle
tt.climb()
tt1=Turtle.Sonclass
tt1.son()
类与魔法方法
class Ball:
def setName(self,name):
self.name=name
def kick(self):
print("i am %s,who? who hit me..." % self.name)
a=Ball()
a.setName("ballA")
a.kick()
#类有一个名为__init__(self[, param1, param2...])
#的魔法方法,该方法在类实例化时会自动调用。
class Ball:
def __init__(self,name):
self.name=name
def kick(self):
print("i am %s,who hit me..." % self.name)
b=Ball('ballB')
b.kick()
class Site:
def __init__(self,name,url):
self.name=name
self.__url=url
def who(self):
print('name:',self.name)
print('url',self.__url)
def __foo(self):
print('it is private')
def foo(self):
print("it is public")
self.__foo()#类里通过对象访问私有方法
c=Site('xyy','www.hhh.com')
c.who()
c.foo()
c.__foo()
类的继承
class people:
name=''
age=0
__weight=0
def __init__(self,n,a,w):
self.name=n
self.age=a
self.__weight=w
def speak(self):
print("%s say that: i am %d years old" %(self.name,self.age))
class student(people):
grade=''
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w)
self.grade=g
def speak(self):
print("%s say that: i am %d years old,i am in %d grade" %(self.name,self.age,self.grade))
s=student('xyy',13,48,3)
s.speak()
1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?
import xx
dir(xx)
help(xx)
2、了解Collection模块,编写程序以查询给定列表中最常见的元素。
题目说明:
输入:language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
输出:Python
from collections import Counter
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
word=Counter(language)
print(word.most_common(1))
f=open('file')
print(f)
print('FileName:',f.name)
for each in f:
print(each)
f=open('file','r')
line=f.read(20)
print("str:%s" %line)
f.close()
a. offset :开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
b. whence :可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开
头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
练习题
1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
2、编写程序查找最长的单词
输入文档: res/test.txt