# python-final **Repository Path**: irenechenm/python-final ## Basic Information - **Project Name**: python-final - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-22 - **Last Updated**: 2021-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Python语言基础 ### 项目名称 一个利用PyCharm中Flask制作的网站,同时运用了Bootstrap框架是网站更美观,更便捷,也运用了pyecharts模版进行了数据可视化操作。 该网站主要有登录/注册功能、上传、聊天室、电影《我不是药神》评分可视化展示等。 ![](/img/名称.png) ### 问题表述 1、登录/注册 一个网站给到用户的第一印象很多时候是登录与注册,所以登录与注册做得是够简洁明了是很重要,这部分我就做得很是简练,满足一个网站的基本需求。 2、上传 上传文本或照片主要需要与本地链接,而在此我亦是做到了基本要求。 3、聊天室 很多时候聊天的时候用户需要匿名,在这部分我则做了这一处理,可以重新选择一个聊天用的用户名。 4、可视化 这部分主要是为了展示在python课上学到的pyecharts知识,能够筛选信息并且爬虫到评分信息,在这里可以是豆瓣中等任意电影,而展示的是我爬虫到的《我不是药神》电影评分相关的一系列可视化数据。 5、首页 首页展示的则是更全面的Bootstrap知识,以及大一时学习的HTML & CSS3 方面等知识,页面的排版,响应式也做了一部分的操作。 ### 解决问题表述 * 用户信息列表中,为了不暴露用户信息,只有管理员能查看,该功能若想查看,可登录管理员账号(用户名:root 密码:root) * 登录与注册后,若不想保留登录信息,可选择注销。 * 使用了pyechartsd的知识,爬虫了豆瓣电影中《我不是药神》电影评分的情况,分别以柱状图、饼图、雷达图、折线图加以展示。 > 项目整体规划 整个项目运用Bootstrap框架来搭建,同时做了响应式。 >> 首页 >>> 运用了Bootstrap知识,以及大一时学习的HTML & CSS3等知识,做了一个简单的个人简介主页。 > 项目更偏向于是一个个人分享型博客,所以其实商业价值不算很大,可是却很大程度上将本学期学到的知识灵活运用了,例如基本的python列表、if for、字典等等都用到了 ### 编程功能和基本描述 * 对于Python的学习,个人认为仅仅是课上的学习是不够,它需要我们大量的练习,同时大量的看别人写的Python代码并不懂就查大量的资料,才能基本的掌握这一知识点。 关于其中的知识点,简单介绍一下 函数 #### 函数 >函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 >函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 >定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: * 函数代码块以 def * 关键词开头,后接函数标识符名称和圆括号 ()。 * 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。 * 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 * 函数内容以冒号 : 起始,并且缩进。 * return [表达式] * 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。 ###### 语法 > Python 定义函数使用 def 关键字,一般格式如下: def 函数名(参数列表): 函数体 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。 ###### 函数调用 > 定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。 > 这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。 * 我要调用用户自定义函数!再次调用同一函数参数传递 在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型, 而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。 ###### 可更改(mutable)与不可更改(immutable)对象 > 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。 > 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。 > 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。 ###### python 函数的参数传递: > 不可变类型:类似 C++ 的值传递,如 整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a))内部修改 a 的值,则是新生成来一个 a。 > 可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响 * python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。 * python 传不可变对象 > 在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id。 * 传可变对象 > 可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。 ###### 参数 以下是调用函数时可使用的正式参数类型: * 必需参数 * 关键字参数 * 默认参数 * 不定长参数 * 必需参数 (必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。) > 调用 printme() 函数,你必须传入一个参数,不然会出现语法错误 > 关键字参数 * 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。 * 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 还有许多相关知识,可参看 * [Python的基本认识1](https://github.com/IreneCchen/python-study-note/blob/main/base.md) * [Python的基本认识2](https://github.com/IreneCchen/python-study-note/blob/main/base2.md) * [环境搭建](https://github.com/IreneCchen/python-study-note/blob/main/introduction.md) * [字典&集合](https://gitee.com/irenechenm/python-homework/blob/master/week06/dict&set.md) > 计算机 >> 当遇到数据问题的时候则需要我们灵活运用网络以及身边会的人,不断的去优化我们的代码,最大程度上的做到精简。例如我在聊天室的页面中,我就参照了许多不同人写的网页版聊天室,将个人认为较好的部分进行结合得出最终代码。 > 传播 >> 对于这一类,我想与我们一样能看得懂,会用便足以了,不需要完全的会码,传播这一类的我们也是尽可能的去了解更多。 ### 云端项目部署的基本描述 * 在pycharm中完成项目的所有内容,且确保都可以显示, 将整个项目压缩。 * 然后在pythonanywhere建一个网页,在网页目录下上传项目压缩包,在后台进行解压。 * 解压完成后,修改了运行文件为自己项目的运行python文件即可。 [pythonanywhere](http://irenecchen.pythonanywhere.com/) 注意:若该网站看不了可查看该视频 [python](https://pan.baidu.com/s/102FUm2aAJSV7ZsCisQGJ-w) 密码:s335 > 关于我的python-final >> 一个简单的分享性博客,有后台管理功能,能上传信息、具有聊天室、以及可视化数据展示,后续仍能有许多附加功能加进去,只有你想不到,没有我加不进去的。基本网页框架是很明显的,分有一级菜单和二级菜单,Bootstrap框架,pyecharts模块等等。 ### 学习心得 * 首先很庆幸自己选到了这门个性化选修课,可能是我个人比较认为这门课程所用的语言很特别很奇妙,老师也很有趣,能让我们更好的了解Python这门课程真正的用途。在学习Python这门课程的这段时间以来,并且自己也能认识并且学习到很多知识,以下就是对这门课程所做的总结: > Python是一种高级动态,完全面向对象的语言,方便快捷。运行程序时,打个比方,计算圆周率类的高级算术题 只要import math math.sqrt()就可以轻松的计算出圆周率,Python就类似于一个超级计算机。 学习的知识点如下: * 1、 整型int与浮点型float:可以进行基本的运算 如5*7=35 、7/2=3.5、7%3=1等 一些相关的数学函数类似于sin之类都在math模块中 ``` a = [1,True,'ab'] a + ["Hello"] a + [False] a + [False] print(len(a)) print(a[1:3]) print(a[0:3:2]) print(a[::-1]) a+a ``` * 2、复数计算与逻辑值:复数的与或非()相关的都可以很快捷的运算出结果 逻辑值如1>2为false、 bool(999)为true * 3、 字符串的相关操作:+拼接、 *复制、len长度、[start:end:step]用来提取一部分和以及一些相关高级操作 如下图(含例): ``` #字符串操作 a,b = 'abc','xyz' print('a' in a) print(ord(a[0])) print(chr(65)) print(r'武汉') print('\u4e2d\u6587') ``` * 4、.列表与元组:列表可以增加、删除、替换和重排的作用和一些切片拆分的操作 如下图: ``` #List列表 a=[1,2,3,4] b = a b[1] = True print(a) #列表元组的基本操作 # + * len() [] in a=[1,2,3] a+[4] a*2 len(a) 2 in a #列表元素的高级操作 mylist=[1,2,3,4,5] mylist[1:4] mylist[2:5] mylist[-3::-1] mylist[::2] #切片 s='abcdefg12345' print(s[3:9]) print(s[5:]) print(s[-1:-6:-1]) print(s[:10:2]) #拆分 t='Mike and Tom' print(t.split(' ')) ``` * 5、range函数:是连续序列生成器 ``` #range函数 list(range(10)) list(range(5,10)) range(0,10) tuple(range(10)) ``` * 6、集合set:集合是不重复元素的无序组合、用set可以创建空集也可用set从其他序列转换生成集合 如下图 ``` #set集合 #不重复元素的无序组合 a=[1,2,3,4,3,2,1] b=set(a) print(a) print(b) #upper/lower/swapcase修改大小写 print(t.upper()) print(t.lower()) print(t.swapcase()) ``` * 7、字典dict:是通过key值来索引values元素 如下图 ``` mydict={1:'Mon','linel':3332} mydict['Mon']=3 'linel' in mydict mydict.keys() mydict.values() mydict.items() ``` * 8、运算表达式,函数调用如 import math /n math.sqrt 和赋值 如a=3 是讲3赋值给a这个逻辑 * 9、if条件语句:包含elif或多条elif语句和一条else语句组成 while语句是条件循环语句 其中break语句是直接跳出循环 如下图 ``` #条件if #elif<逻辑条件>:可以多个elif a=12 if a>10: print("Great!") elif a>6: print("Middle!") else: print("Low!") #while循环 numbers=[12,37,5,42,8,3] even = [] odd = [] while len(numbers) > 0: number = numbers.pop() if(number % 2 == 0): even.append(number) else: odd.append(number) print('even:',even) print('odd:',odd) ``` * 10、函数function :定义函数为def语句 调用函数为<函数名>(<参数>) 相关例子如下图: ``` def sum_list(alist): #定义一个带参数的函数 sum_temp = 0 for i in alist: sum_temp += i return sum_temp #函数返回值 print(sum_list) #查看函数对象sum_List my_list = [23,45,67,89,100] #调用函数,讲返回值赋值给my_sum my_sum = sum_list(my_list) print("sum of my List;%d" % (my_sum,)) def func(n): total = 1 for i in range(1, n+1): total = total+1 return total def sum(n): total = 0 for i in range(1,n + 1): total += func(i) print(sum) sum(3) def func_test(key1,key2,key3=23): print("k1=%s,k2=%s,k3=%s" % (key1,key2,key3)) print("====fun_test") func_test('v1','v2') func_test('ab','cd',768) func_test(key2='kk',key1='k') ``` * 11、参数 及位置参数 ``` #参数的默认值 def thank_you(name='everyone'): print('You are doing good work ,%s!' %name) thank_you() thank_you('张三') #位置参数 def desc_person(first_name,last_name,age): print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) print("Age: %d" % age) desc_person('brain','kernighan',30) desc_person(age=20,first_name='zhang',last_name='hai') #混合位置和关键字参数 def desc_person(first_name,last_name,age=None,favorite_language=None): print("First name: %s" % first_name.title()) print("Last name: %s" % last_name.title()) if age: print("Age :%d" % age) if favorite_language: print("Favorite language : %s" % favorite_language) desc_person('brian','kernighan',favorite_language='C') desc_person('ken','thompson',age=22) #接受任意数量的参数 def example_function(num_1,num_2,*nums): sum = num_1+num_2 #Then add any other numbers that were sent. for num in nums: sum = sum + num # Print the results. print("The sum of your numbers is %d." % sum) example_function(1,2) example_function(1,2,3) example_function(1,2,3,4) example_function(1,2,3,4,5) ``` * 12、.map函数:需要对列表中每个元素做一个相同的处理,得到新列表 ``` #map def add(a,b): return a + b lst = [1,2,3,4,5] print(map (add,lst,lst)) print(list(map(add,lst,lst))) #filter def is_even(x): return x % 2 == 0 lst = [1,2,3,4,5] print(list(filter(is_even,lst))) #reduce函数对参数进行累积 from functools import reduce def myadd(x , y): return x + y lst = [1,2,3,4,5] sum = reduce(myadd,lst) print(sum) ``` * 13、 匿名函数lambda:可以返回一个匿名函数 表达式为:lambda<参数表>:<表达式> ``` #lambda函数(匿名函数) answer = lambda x:x**2 print(answer(5)) #map(),filter() reduce()结合lambda表达式 print(list(map( lambda x: x+x, [y for y in range(10)]))) print(list(map( lambda a, b: a+b,[x for x in range(10)],[y for y in range(10)]))) print(list(filter( lambda a: a & 1 ==0 , [x for x in range(10)]))) print(reduce(lambda x,y : x*y , [a for a in range(1,10)])) ``` * 14、time()函数 ``` #获取当前的时间戳 time.time() localtime = time.localtime(time.time()) print("本地时间为:",localtime) #格式化时间 localtime = time.asctime(time.localtime(time.time())) print("本地时间为:",localtime) print(time.s) ``` * 15、面向对象 ``` #力 class Force: def __init__(self, x, y): #x,y方向分量 self.fx, self.fy =x,y def show(self): #打印出力的值 print("Force<%s,%s>" % (self.fx, self.fy)) def add(self,force2): #与另一个力合成 x = self.fx + force2.fx y = self.fy + force2.fy return Force(x,y) #类定义中的特殊方法 def __str__(self): return 'Force<%r, %r>' % (self.x, self.y) def __mul__(sel,n): x, y = self.x * n, self.y *n return Force(x,y) def __add__(self, other): x ,y = self.x + other.x, self.y + other.y return Force(x, y) def __eq__(self, other): return(self.x == other.x) and (self.y == other.y) def __repr__(self): return 'Force({0.x!r},{0.y!r})'.format(self) #生成一个力对象 f1 = Force(0,1) f1.show() #生成另一个力对象 f2 = Force(3,4) #合成为新的力 f3 = f1.add(f2) f3.show() class Student: def __init__(self, name, grade): self.name, self.grade = name, grade #内置sort函数只引用<比较符来判断前后 def __lt__(self, other): #成绩比other高的,排在他前面 return self.grade > other.grade #Student的易读字符串表示 def __str__(self): return "(%s,%d)" % (self.name, self.grade) #Student的正式字符串表示,我们让它跟易读表示相同 __repr__=__str__ #构造一个Python list对象 s = list() #添加到student对象到list中 s.append(Student("Jack",80)) s.append(Student("Jane",75)) s.append(Student("Smith",82)) s.append(Student("Cook",90)) s.append(Student("Tom",70)) print("Original:", s) #对list进行排序,注意这是内置sort方法 s.sort() #查看结果,已经按照成绩排好序 print("Sorted:",s) class Car: def __init__(self, name): self.name = name; self.remain_mile = 0 def fill_fule(self, miles): self.remain_mile = miles def run(self, miles): print (self.name,end=':') if self.remain_mile >= miles: self.remain_mile -= miles print("run %d miles!" % (miles,)) else: print("fuel out!") class GasCar(Car): def fill_fuel(self,gas): #加汽油gas升 self.remain_mile = gas * 6.0 #每升跑6英里 class ElecCar(Car): def fill_fuel(self, power): #充电power度 self.remain_mile = power * 3.0 #每度电3英里 gcar=GasCar("BMW") gcar.fill_fuel(50.0) gcar.run(200.0) ecar=ElecCar("Tesla") ecar.fill_fuel(60.0) ecar.run(200.0) try: print('try...') r = 10 / 'xyz' print('result:',r) except TypeError as e: print('TypeError:',e) except ZeroDivisionError as e: print('no error!') else: print('no error!') finally: print('finally...') print('END') ``` ### 参考的文档 [flask网页搭建](https://blog.csdn.net/encore47/article/details/108921457?ops_request_misc=&request_id=&biz_id=102&utm_term=flask%25E4%25B8%25BB%25E9%25A1%25B5&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-108921457.first_rank_v2_pc_rank_v29) [首页展示](https://blog.csdn.net/JENREY/article/details/85628830?ops_request_misc=&request_id=&biz_id=102&utm_term=flask%25E4%25B8%25BB%25E9%25A1%25B5&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-85628830.first_rank_v2_pc_rank_v29) [聊天室1](https://blog.csdn.net/Marksinoberg/article/details/72828117?utm_source=blogxgwz2&ops_request_misc=&request_id=&biz_id=102&utm_term=flask%25E8%2581%258A%25E5%25A4%25A9%25E5%25AE%25A4&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-8-72828117.first_rank_v2_pc_rank_v29) [聊天室2](https://blog.csdn.net/qq_36813467/article/details/90198947?ops_request_misc=&request_id=&biz_id=102&utm_term=flask%25E8%2581%258A%25E5%25A4%25A9%25E5%25AE%25A4&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-7-90198947.first_rank_v2_pc_rank_v29)