笔记开始简介
从2018年9月份正式进入大学的时代,大数据和人工智能的崛起让我选择了计算机专业学习数据科学与大数据技术专业,接触的第一门语言就是C语言,后来因为同学推荐的原因进入了学校的人工智能研究协会,开始了正式学习Python的旅程,C语言+Python一起学习让我感受到了Python的简洁,优美的魅力并且让我无法自拔,C语言我并没有特别深入的学习,学校也没有安排相关的课程,而Python是第四学期的课程,第二第三学期学了Java,但是和Python相比确实也是繁琐了不少,Java的应用确实是十分的广泛,但是Python的各种各样的第三方库让Python近乎无所不能,同时也在数据分析,数据可视化等方面应用十分广泛,其实从2018年开始我就想过写博客,但是一直没有动笔,这次新型冠状病毒的原因宅在家里实在是无聊,于是我就开始整理自己的学习笔记,希望看到的人有错误可以指正给我,谢谢。(一些内容源自网课,书籍)
笔记内容:
一、Python的发展
1.Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python的创始人为荷兰人吉多·范罗苏姆 (Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提.派森的飞行马戏团》(Monty Python's Flying Circus)。Python从开发出来开始一直到现在所能担任的开发任务也是越来越多,其中包括云计算,Web前端开发,人工智能,系统运维工程项目等等。
2.Python是一门什么类型的语言?
Python是一门动态解释型的强类型定义语言
编译型和解释型
编译型,其实它和汇编语言是一样的,也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说的专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件、声音文件什么的,还要负责去除目标文件之间的冗余重复代码,等等,所以...也是挺累的。链接完成后,一般就可以得到我们想要的可执行文件了。
上面我们大概介绍了编译型语言的特点,现在再看看解释型。从字面上看,“编译”和“解释”的确有“翻译”的意思,他们的区别在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他把整本书从头到尾翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。
两种方式,前者相当于我们说的编译型:一次把所有代码朱焕为机器语言,然后写可执行文件;而后这就相当于我们说的解释型:在程序运行的前一刻,还只有源程序没有可执行程序;而程序每执行到源程序的某一条指令,则会有有一个称为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之就是不断的解释、执行、解释、执行.....所以解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC。解释型程序中由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是意见不小时间的消耗,况且很可能一些细节的地方还要需要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即执行,不必像编译程序一样每次进行小小改动都要耐心等待漫长Compiling...Linking...这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。
编译型和解释型各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释型语言,如Java、JavaScript、VBScript、Perl、Python等等。
但既然编译型和解释型各有优缺点又互相对应,所以一批新兴的语言都有把两者折中起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,单VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序体。C#(以及其他.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟平台)进行执行。当然.net目标代码已经相当低级,比较接近机器语言了,所以仍将其视为编译语言,,而且其移植程度也没有Java号称的这么强大,Java号称是“一次编译,到处执行”,而.net则是“一次编码,到处编译”。总而言之,随着设计技术与硬件不断发展,编译型与解释型两种方式的界限正在不断变得模糊。
动态语言和静态语言
通常我们说的动态语言和静态语言是指动态类型语言和静态类型语言。
(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型 语言编译的时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
(2)静态类型语言:静态类型语言和动态类型语言正好相反,它的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、Java等。
强类型定义语言和弱类型定义语言
(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子,如果您定义了一个整型变量a,那么程序根本不能将a当做字符串类型处理。强类型定义语言是类型安全的语言。
(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反。一个变量可以赋不同数据类型的值。
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言);VBScript是动态语言,是弱类型定义语言(类型不安全的语言);Java是静态语言,是强类型定义语言(类型安全的语言)。
二、Python的安装
登录www.python.org网站下载Python的最新版本,在安装过程中记得把pip也一并安装上,只需要在安装时把pip前面的对号打上就OK了,并且将Python添加到环境变量里。这样的话就不用再自己安装pip,并且以后安装第三方库也十分的方便。
三、Python的第一个程序Hello World!
创建一个文件名为Hello.py
1 print("Hello World!")
运行Hello.py来输出Hello World!
1 >>>print("Hello World!") 2 Hello World!
对比其他语言的Hello World!
1 #include<iostream> 2 int main(void) 3 { 4 std::cout<<"Hello World!"; 5 }
1 public class Helloworld{ 2 public static void main(String args[]){ 3 System.out.println("Hello World!"); 4 } 5 }
1 #include<stdio.h> 2 int main(){ 3 printf("Hello World!"); 4 return 0; 5 }
1 <?php 2 echo "Hello World!"; 3 ?>
四、变量
变量是用来存储数据的,数据存储在变量里,变量存储在内存中。
Python的变量命名规则:
python的变量在使用时不需要提前声明变量,在使用时直接给变量进行赋值即可
1 name = "Machine"
Python的变量命名有几个规则:变量名只能使用数字、字母、下划线,并且不允许以数字开头,变量名不能以关键字命名,变量名尽量贴合实际,比如用于存储名字的变量尽量命名为name,而不是a、b等。
命名方法:(1)驼峰式命名:有时为了表达清楚变量的含义,一个单词是不够的,需要词组来表示,例如:我的名字 MyName 。每个单词的首字母大写。
(2)下划线命名:My_name 每个单词之间用下划线连接。
关键字:and elif import return as else in try assert except is while break finally lambda with class for not yield continue from or def global pass del if raise
五、字符编码
计算机最底层的存储只认识0和1,0和1即为二进制,只认识0和1的原因是计算机的底层就是电路,而电路只有两种状态,一种是通电,一种是不通电,通电是1,不通电是0,只能表示两种数据,而多个电路组合在一起就可以表示多种状态,多种状态表示多种二进制数,我们用各种不同的二进制数来表示各种各样的字符,从而产生了字符编码。
Python解释器在加载 .py文件中的代码时,会对内容进行编码(默认为ASCII)
ASCII是美国标准信息交换代码,是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西方余元,其中最多只能用8位来表示(一个字节),即:2**8 = 256-1,所以,ASCII最多只能表示255个符号。
上表中只有1~127个,是因为计算机诞生于西方,而西方的英文字母只有26个,加上大小写,特殊符号等等一共才使用了127个,而剩下的128~255预留给了其他的国家,后来各种语言的符号都添加到表中预留的位置,但是中华文化博大精深,仅仅常用的汉字加起来就不是剩下位置所能装下的了,于是我们对这个表进行了扩展,只要是汉字就在这个扩展的表中,这个表包含了七千多个汉字,这就是常看到的GB2312。后来越来越多的符号和汉字被发现GB2312已经满足不了需求了于是又产生了GBK,后来在2000年产生了GB18030,从ASCII→GB2312→GBK→GB18030都是向下兼容的。在之前使用MP3的时代有的时候我们在电脑上可以看到的字符,到了MP3上就变成了乱码,是因为MP3不支持GB18030,只支持GB2312。这些编码方式只是一个国家的编码方式,而每个国家的编码反方式不同导致,安装不同国家的软件经常出现乱码,所以国际的组织发布了一个同意的标准Unicode(统一码,万国码)。
Unicode是一种在计算机上使用的字符编码,Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言的每个字符都设定了统一并且唯一的二进制编码,规定所有的字符最少由16位来表示(两个字节),即:2**16 = 65536;
UTF-8是对Unicode编码的压缩和优化,它不再使用最少使用两个字节,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存,欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
六、注释
单行注释:#被注释的内容
多行注释:"""被注释的内容""" (可以是单引号也可以是双引号)
三引号不仅可以注释多行,同时也可以打印多行
1 code = """ print("Hello World!") 2 name = "Machine" 3 print(name)"""
上述代码会把三引号中间的全部内容都打印出来包括回车换行。这些内容都是字符串。
一定要善用注释,多用注释,因为人的记忆会随时间减退,自己写完的代码也无法一直记住,所以在写的时候添加注释可以帮助我们记忆。
七、 字符串以及用户输入
打印多行的字符串用三引号,打印单行的字符串用双引号或者单引号即可
1 print("My name is Machine.") 2 print('My name is Machine.')
输出数据我们使用print,而要想输入数据我们使用input()
1 UserName = input("UserName:") 2 PassWord = input("PassWord:") 3 print(UserName,PassWord)
第一行代码让用户输入用户名,并且我们在input(),中写上了提示语"UserName:"意思是让用户zh输入,并且程序处于等待中,等待输入再执行下一行代码,在input()中我们在引号里的内容不影响程序执行,会原样打印出来。如果我们第一行输入Machine,第二行输入123456789,那么UserName被赋值为Machine,PassWord被赋值为123456789,print()将其两个变量打印出来。
字符串的拼接
1 name = input("Name:") 2 age = input("Age:") 3 job = input("Job:") 4 salary = input("Salary:") 5 data = ''' 6 -----------info of '''+ name +'''----------- 7 Name:''' + name +''' 8 Age:'''+ age +''' 9 job:'''+ job +''' 10 salary:'''+ salary 11 print(data)
我们分别键盘输入为 Machine、20、IT、10000。
输出结果为:
字符串与字符串之间可以用 + 号来进行拼接十分的方便。
但是这么写十分的繁琐并且LOW!!!
所以我们使用%s占位符
1 name = input("Name:") 2 age = input("Age:") 3 job = input("Job:") 4 salary = input("Salary:") 5 data = ''' 6 -----------info of %s----------- 7 Name:%s 8 Age:%s 9 job:%s 10 salary:%s 11 '''% (name,name,age,job,salary,name) 12 print(data)
我们把之前添加拼接的位置使用%s占位,并且在字符串的后面写上% (变量1,变量2,变量3,......),切记各个变量一定要一一对应,而且不可以多写变量或者少写变量。
输出的结果与拼接的写法输出相同,这就叫格式化输出,%s中的s代表的是string,string代表的是字符串,所以%后面不仅可以接收字符串还可以接收数字%d,比如年龄和工资是数字,所以可以写成%d,字符串是不可以进行计算的,而数字是可以的。有了%s、%d那么就有%f接收浮点数。
1 name = input("Name:") 2 age = input("Age:") 3 job = input("Job:") 4 salary = input("Salary:") 5 data = ''' 6 -----------info of %s----------- 7 Name:%s 8 Age:%d 9 job:%s 10 salary:%d 11 '''% (name,name,age,job,salary,name) 12 print(data)
这样写运行之后是这样的
红色框中的报错内容为%d接收的应该是一个数字,而不是字符串。那么就证明数据在输入的时候就不是字符串数据类型,因为Python是一门动态解释型的强类型定义语言,所以我们需要对输入的数据进行类型的强制转换,由字符串变为整型,整型表示为int(input());使用int()进行强制转换。
1 name = input("Name:") 2 age = int( input("Age:") ) 3 job = input("Job:") 4 salary = int( input("Salary:") ) 5 data = ''' 6 -----------info of %s----------- 7 Name:%s 8 Age:%d 9 job:%s 10 salary:%d 11 '''% (name,name,age,job,salary,name) 12 print(data)
这样写把年龄和工资都转换成整型就可以正确运行了。
同理整型转换成字符串类型用str()。
注:如果想查看数据的类型可以用type(变量);
1 name = 'Machine' 2 age = 20 3 print(type(name)) 4 print(type(age))
显示结果为:
str为字符串类型,int为整型。
其实格式化输出还有其他的方式
1 name = input("Name:") 2 age = input("Age:") 3 job = input("Job:") 4 salary = input("Salary:") 5 data = ''' 6 -----------info of {_name}----------- 7 Name:{_name} 8 Age:{_age} 9 job:{_job} 10 salary:{_salary} 11 '''.format( 12 _name = name, 13 _age = age, 14 _job = job, 15 _salary = salary) 16 print(data)
.format()花括号里的内容就是定义一个新的变量来代替所表示的变量,而在.format()里把每个新定义的变量进行赋值。
也可以这样写
name = input("Name:") age = input("Age:") job = input("Job:") salary = input("Salary:") data = ''' -----------info of {0}----------- Name:{0} Age:{1} job:{2} salary:{3} '''.format(name,age,job,salary) print(data)
字符串的拼接使用加号的方式尽量少用,因为+号的拼接方式效率低下,并且还会开辟很多内存,十分的LOW~~
八、选择与循环
选择与判断是编程最基础,最重要的一部分。
猜年龄小游戏
1 My_age = 20 2 guess_age = int(input("请输入你猜测的年龄:")) 3 if My_age == guess_age: 4 print("恭喜你猜对了!!!") 5 else: 6 print("很遗憾......猜错了......")
Python采用严格的缩进来进行格式控制。
if之后的逻辑语句,如果这个语句是争取的那么就执行冒号后面的语句,如果是错误的那就执行else后面的语句。
除了if和else还有一个elif
1 My_age = 20 2 guess_age = int(input("请输入你猜测的年龄:")) 3 if My_age == guess_age: 4 print("恭喜你猜对了!!!") 5 elif guess_age > My_age: 6 print("很遗憾......猜大了......") 7 else: 8 print("很遗憾......猜小了......")
elif的使用可以让我们的程序进行多重选择,在if和else中间可以写入n个elif,可以进行多次选择。
这个猜年龄小游戏我们每猜一次就要重新运行一次程序,我们想一直猜,直到猜对为止,那么就要添加循环while;
1 My_age = 20 2 while True: 3 guess_age = int(input("请输入你猜测的年龄:")) 4 if My_age == guess_age: 5 print("恭喜你猜对了!!!") 6 break 7 elif guess_age > My_age: 8 print("很遗憾......猜大了......") 9 else: 10 print("很遗憾......猜小了......")
while True表示的是如果while下面的代码一直运行直到为真,真就是1,就是if后面的语句。
break与continue的区别:
1、break:while循环break是用于永久终止循环。即不执行本次循环中break后面的语句,直接跳出循环。
2、continue:while循环continue是用于终止本次循环。即本次循环中continue后面的代码不执行,进行下一次循环的入口判断
如果只想让玩家猜测三次那么我们就要在程序之中加一个计数器
1 My_age = 20 2 count = 0 3 while True: 4 if count == 3: 5 break 6 guess_age = int(input("请输入你猜测的年龄:")) 7 if My_age == guess_age: 8 print("恭喜你猜对了!!!") 9 break 10 elif guess_age > My_age: 11 print("很遗憾......猜大了......") 12 else: 13 print("很遗憾......猜小了......") 14 count += 1
或者直接控制while的循环次数
1 My_age = 20 2 count = 0 3 while count<3: 4 guess_age = int(input("请输入你猜测的年龄:")) 5 if My_age == guess_age: 6 print("恭喜你猜对了!!!") 7 break 8 elif guess_age > My_age: 9 print("很遗憾......猜大了......") 10 else: 11 print("很遗憾......猜小了......") 12 count += 1
如果我们想提示玩家他因为猜了三次了所以才退出的我们可以这样写
1 My_age = 20 2 count = 0 3 while count<3: 4 guess_age = int(input("请输入你猜测的年龄:")) 5 if My_age == guess_age: 6 print("恭喜你猜对了!!!") 7 break 8 elif guess_age > My_age: 9 print("很遗憾......猜大了......") 10 else: 11 print("很遗憾......猜小了......") 12 count += 1 13 else: 14 print("你已经猜了三次了,拜拜")
这里我们用到了else,这里的else的作用是如果while后面的逻辑语句是真的话那么就一直执行,如果while后面的逻辑语句是假的话就执行else下的语句。和if...else很像。
除了while循环还有for循环
1 for i in range(10): 2 print('number:',i)
输出结果:
range(n)默认从0开始打印打印到n-1
for循环后面也可以加上else使用,但是和while不同的是,如果for正常执行了就不运行else下面的代码,如果不正常运行被破坏了那么就运行else下面的代码。
range()中的参数可以写一个,可以写两个,也可以写三个。
range(number1):意思是从0开始一直循环到number-1,且每次只加1。
range(number1,number2):意思是从number1开始循环,一直到number2,且每次只加1。
range(number1,number2,step):意思是从number1开始循环,一直到number2,且每次加step,step为步长,默认为1。
选择与循环都可以进行嵌套
猜年龄小游戏(如果猜三次玩家还想继续猜)
1 My_age = 20 2 count = 0 3 while count < 3: 4 guess_age = int(input("请输入你猜测的年龄:")) 5 if My_age == guess_age: 6 print("恭喜你猜对了!!!") 7 break 8 elif guess_age > My_age: 9 print("很遗憾......猜大了......") 10 else: 11 print("很遗憾......猜小了......") 12 count += 1 13 if count == 3: 14 next_guess =input("你已经猜了三次还想继续玩吗请回复YES或者NO:") 15 if next_guess == 'YES': 16 count = 0 17 else: 18 print("拜拜~~~~~~~")
循环嵌套示例:
打印下面图形
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
1 for i in range(5): 2 for i in range(5): 3 print("*",end=' ') 4 print("\n")
Python的print()输出的时候是自带一个回车换行的,如果想删除掉这个回车换行的话就要在print中写上end = ' ',意思是以什么结束,如果把空格换成其他字符的话,比如+号,在输出过后也会在末尾加上一个加号。
无论是编程语言还是任何技术,不断的练习才是掌握的根本!!!!
来源:https://www.cnblogs.com/Machinehe/p/12274516.html