上次的网易云爬虫实践失败了,原理是懂的,但其实网易云的爬取遇到的问题还是没法解决。
这不是简简单单下载代码读读跑一下就行的。其实也反映了我python方面的基础知识不足。
于是在Github上找到一个项目学习:从零开始学习人工智能,挑战100天学习python链接
我决定尝试一下,每天在此记录。
day1
简单介绍了下python,交互,库,安装方法。
day2
介绍了下变量类型,运算符。写几个应用的
1.华氏度转摄氏度
1 2 3
| f=float(input("华氏度:")) c=(f-32)/1.8 print("摄氏度:{}".format(c))
|
2.计算圆的周长面积
1 2 3 4
| pi=3.14 r=float(input("r:")) print("length:{}".format(2*pi*r)) print("area:{}".format(pi*r**2))
|
day3 分支结构:if的用法
注意缩进
if ;elif ;else
day4 循环结构:for的用法,while的用法
range用法:
range(101):可以用来产生0到100范围的整数,需要注意的是取不到101。
range(1, 101):可以用来产生1到100范围的整数,相当于前面是闭区间后面是开区间。
range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。
break只能终止它所在的那个循环;continue用来放弃本次循环后续的代码直接让循环进入下一轮。
day5 构造程序逻辑
写个三个算法,找素数,完美数,斐波那契数列。
不知道是不是vscode有问题,前几次明明代码逻辑没错都不出结果。
day6 函数和模块的使用
1 2 3 4 5 6
| def fac(num): """求阶乘""" result = 1 for n in range(1, num + 1): result *= n return result
|
1 2 3 4 5
| 函数定义: def 函数命(参数): ··· ··· return ···
|
python函数无需重载,支持可变参数(变得是参数的数量)。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 在参数名前面的*表示args是一个可变参数 def add(*args): total = 0 for val in args: total += val return total
在调用add函数时可以传入0个或多个参数 print(add()) print(add(1)) print(add(1, 2)) print(add(1, 2, 3)) print(add(1, 3, 5, 7, 9))
|
可以用模块管理函数,模块就是一个python文件
在vscode上实践了一下。
原理就是,一个python文件是一个模块,里面有定义的函数,
1
| 引用方法: from 模块名 import 函数名
|
函数可以嵌套,全局变量:global
Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,
所谓的“内置作用域”就是Python内置的那些标识,我们之前用过的input、print、int等都属于内置作用域。
day7 字符串和常用数据结构
1 2 3 4 5 6 7 8
| s1 = 'hello, world!' s2 = "hello, world!" 以三个双引号或单引号开头的字符串可以折行 s3 = """ hello, world! """ print(s1, s2, s3, end='')
|
\ 后面:二进制,八进制,十六进制
\n 换行 ; \t 制符
可以使用*运算符来重复一个字符串的内容,可以使用in和not in来判断一个字符串是否包含另外一个字符串(成员运算),
我们也可以用[]和[:]运算符从字符串取出某个字符或某些字符(切片运算),代码如下所示。
常用输出字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| print("{}".format(a)) s1 = 'hello ' * 3 print(s1) # hello hello hello s2 = 'world' s1 += s2 print(s1) # hello hello hello world print('ll' in s1) # True print('good' in s1) # False 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
|
切片的操作是左闭右开
字符串处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| str1 = 'hello, world!' # 通过内置函数len计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的拷贝 print(str1.capitalize()) # Hello, world! # 获得字符串每个单词首字母大写的拷贝 print(str1.title()) # 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.isdigit()) # False # 检查字符串是否以字母构成 print(str2.isalpha()) # False # 检查字符串是否以数字和字母构成 print(str2.isalnum()) # True str3 = ' jackfrued@126.com ' print(str3) # 获得字符串修剪左右两侧空格之后的拷贝 print(str3.strip())
|
好困啊,看一集生活大爆炸就睡觉吧,明天起来跑完步继续吧 o( ̄▽ ̄)d
列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| list1 = [1, 3, 5, 7, 100] print(list1) # [1, 3, 5, 7, 100] # 乘号表示列表元素的重复 list2 = ['hello'] * 3 print(list2) # ['hello', 'hello', 'hello'] # 计算列表长度(元素个数) print(len(list1)) # 5 # 下标(索引)运算 print(list1[0]) # 1 print(list1[4]) # 100 # print(list1[5]) # IndexError: list index out of range print(list1[-1]) # 100 print(list1[-3]) # 5 list1[2] = 300 print(list1) # [1, 3, 300, 7, 100] # 通过循环用下标遍历列表元素 for index in range(len(list1)): print(list1[index]) # 通过for循环遍历列表元素 for elem in list1: print(elem) # 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值 for index, elem in enumerate(list1): print(index, elem)
|
列表操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| list1 = [1, 3, 5, 7, 100] # 添加元素 list1.append(200) list1.insert(1, 400) # 合并两个列表 # list1.extend([1000, 2000]) list1 += [1000, 2000] print(list1) # [1, 400, 3, 5, 7, 100, 200, 1000, 2000] print(len(list1)) # 9 # 先通过成员运算判断元素是否在列表中,如果存在就删除该元素 if 3 in list1: list1.remove(3) if 1234 in list1: list1.remove(1234) print(list1) # [1, 400, 5, 7, 100, 200, 1000, 2000] # 从指定的位置删除元素 list1.pop(0) list1.pop(len(list1) - 1) print(list1) # [400, 5, 7, 100, 200, 1000] # 清空列表元素 list1.clear() print(list1) # []
|
列表切片:
1 2 3 4 5 6 7 8 9 10 11 12 13
| fruits = ['grape', 'apple', 'strawberry', 'waxberry'] fruits += ['pitaya', 'pear', 'mango'] # 列表切片 fruits2 = fruits[1:4] print(fruits2) # apple strawberry waxberry # 可以通过完整切片操作来复制列表 fruits3 = fruits[:] print(fruits3) # ['grape', 'apple', 'strawberry', 'waxberry', 'pitaya', 'pear', 'mango'] fruits4 = fruits[-3:-1] print(fruits4) # ['pitaya', 'pear'] # 可以通过反向切片操作来获得倒转后的列表的拷贝 fruits5 = fruits[::-1] print(fruits5) # ['mango', 'pear', 'pitaya', 'waxberry', 'strawberry', 'apple', 'grape']
|
列表排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry'] list2 = sorted(list1) # sorted函数返回列表排序后的拷贝不会修改传入的列表 # 函数的设计就应该像sorted函数一样尽可能不产生副作用 list3 = sorted(list1, reverse=True) # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序 list4 = sorted(list1, key=len) print(list1) print(list2) print(list3) print(list4) # 给列表对象发出排序消息直接在列表对象上进行排序 list1.sort(reverse=True) print(list1)
|
生成式和生成器。。。
元组:元素不能修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # 定义元组 t = ('骆昊', 38, True, '四川成都') print(t) # 获取元组中的元素 print(t[0]) print(t[3]) # 遍历元组中的值 for member in t: print(member) # 重新给元组赋值 # t[0] = '王大锤' # TypeError # 变量t重新引用了新的元组原来的元组将被垃圾回收 t = ('王大锤', 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)
|
集合:Python中的集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| # 创建集合的字面量语法 set1 = {1, 2, 3, 3, 3, 2} print(set1) print('Length =', len(set1)) # 创建集合的构造器语法(面向对象部分会进行详细讲解) set2 = set(range(1, 10)) set3 = set((1, 2, 3, 3, 2, 1)) print(set2, set3) # 创建集合的推导式语法(推导式也可以用于推导集合) set4 = {num for num in range(1, 100) if num % 3 == 0 or num % 5 == 0} print(set4) 向集合添加元素和从集合删除元素。 set1.add(4) set1.add(5) set2.update([11, 12]) set2.discard(5) if 4 in set2: set2.remove(4) print(set1, set2) 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))
|
字典:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| # 创建字典的字面量语法 scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82} print(scores) # 创建字典的构造器语法 items1 = dict(one=1, two=2, three=3, four=4) # 通过zip函数将两个序列压成字典 items2 = dict(zip(['a', 'b', 'c'], '123')) # 创建字典的推导式语法 items3 = {num: num ** 2 for num in range(1, 10)} print(items1, items2, items3) # 通过键可以获取字典中对应的值 print(scores['骆昊']) print(scores['狄仁杰']) # 对字典中所有键值对进行遍历 for key in scores: print(f'{key}: {scores[key]}') # 更新字典中的元素 scores['白元芳'] = 65 scores['诸葛王朗'] = 71 scores.update(冷面=67, 方启鹤=85) print(scores) if '武则天' in scores: print(scores['武则天']) print(scores.get('武则天')) # get方法也是通过键获取对应的值但是可以设置默认值 print(scores.get('武则天', 60)) # 删除字典中的元素 print(scores.popitem()) print(scores.popitem()) print(scores.pop('骆昊', 100)) # 清空字典 scores.clear() print(scores)
|
看着感觉挺简单,实际做慕课作业时真写不出来
day8 面向对象编程
用class关键字定义
1 2 3 4 5 6 7 8 9 10
| class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作 # 通过这个方法我们可以为学生对象绑定name和age两个属性 def __init__(self, name, age): self.name = name self.age = age
def study(self, course_name): print('%s正在学习%s.' % (self.name, course_name))
|
对于上述对象,我们可以描述其行为
1 2 3 4 5 6
| def def(): 创建对象 stu1=Student('艾伦',18) stu1.study('高等数学') if __name__="__main__": main()
|
day9 面向对象进阶
面向对象有三大属性:继承,封装,多态
python通过属性的访问器和修改器来实现封装性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Person(object):
def __init__(self, name, age): self._name = name self._age = age
# 访问器 - getter方法 @property def name(self): return self._name
# 访问器 - getter方法 @property def age(self): return self._age
# 修改器 - setter方法 @age.setter def age(self, age): self._age = age
def play(self): if self._age <= 16: print('%s正在玩飞行棋.' % self._name) else: print('%s正在玩斗地主.' % self._name)
def main(): person = Person('王大锤', 12) person.play() person.age = 22 person.play() # person.name = '白元芳' # AttributeError: can't set attribute
if __name__ == '__main__': main()
|
这边不太想学了,以后要用再来看吧,直接过
等我先把形策和英语作文写了,晚上再看一节
day10 图形用户界面和游戏开发
简单讲了下面向对象编程的应用,做了个大球吃小球的游戏,不太会,感兴趣可以看看pygame官网
day11 文件和异常
操作模式 |
具体含义 |
‘r’ |
读取 (默认) |
‘w’ |
写入(会先截断之前的内容) |
‘x’ |
写入,如果文件已经存在会产生异常 |
‘a’ |
追加,将内容写入到已有文件的末尾 |
‘b’ |
二进制模式 |
‘t’ |
文本模式(默认) |
‘+’ |
更新(既可以读又可以写) |
读取,写入文本文件,二进制文件,
json文件不看
day12 字符串和正则表达式
正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式(如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉)。
day13 进程和线程
day14 网络编程入门和网络应用开发
day15 图像和办公文档处理
day16-20 语言进阶
以上均是python的一些基础知识和进阶用法。
21-30 web前端概述
学过一些,只熟悉html和css部分