-
一、编程和编程语言
电脑的基本原理:
#计算机通过高低电流表示二进制数的1和0,所以计算机识别的是电压的高低,准确地说是用电压表示的各种数据,即数字信号;其他的物理量必须通过传感器等设备转换成数字信号,计算机才能进行分析处理.
编程的目的:
#编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果;
什么是编程语言?
#能够被计算机所识别的表达方式就是编程语言,语言是沟通的介质,而编程预言家就是人与计算机沟通的介质。在编程的世界里,计算机更像人的奴隶,人类的编程的目的就是命令奴隶去工作;
什么是编程?
#编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含了一堆字符的文件; #强调:程序在未运行前跟普通文件无异,只有在程序运行时,文件内所有的字符才有特定的语法意义
编程语言的发展经历:
#机器语言:站在计算机(奴隶)的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件; #汇编语言:站在计算机(奴隶)的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作件; #高级语言:站在人(奴隶主)的角度,说人话,即用人类的字符去编写程序,屏蔽了硬件操作;
编程语言分类:
#1.编译型:编译型(需要编译器,相当于用谷歌翻译):如C、C++,执行速度快,调试麻烦; #2.解释型(需要解释器,相当于同声传译):如python、Java,执行速度慢,调试方便;
总结:
机器语言 #优点是最底层,与机器直接交互,执行效率最高; #缺点是最复杂,开发效率最低,学习难度最高 汇编语言 #优点是比较底层,执行速度较高 #缺点是复杂,开发效率最低,学习难度高 高级语言 #编译型语言执行速度快,不依赖语言环境运行,跨平台差 #解释型语言 #优点跨平台好一份代码,到处使用,开发效率最高,学习难度低 #缺点是执行速度慢,依赖解释器运行,执行效率低 学习难度从高到低,执行效率从高到低、开发效率从低到高 为什么选择解释型语言? #开发效率高,执行速度可以通过硬件的发展和堆积来解决
2019年3月数据(https://www.tiobe.com/tiobe-index/)
-
三、Python介绍
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等 。
目前Python主要应用领域 :
#1. WEB开发——最火的Python web框架Django, 支持异步高并发的Tornado框架,短小精悍的flask,bottle, Django官方的标语把Django定义为the framework for perfectionist with deadlines(大意是一个为完全主义者开发的高效率web框架) #2. 网络编程——支持高并发的Twisted网络框架, py3引入的asyncio使异步编程变的非常简单 #3. 爬虫——爬虫领域,Python几乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬啥就爬啥 #4. 云计算——目前最火最知名的云计算框架就是OpenStack,Python现在的火,很大一部分就是因为云计算 #5. 人工智能——谁会成为AI 和大数据时代的第一开发语言?这本已是一个不需要争论的问题。如果说三年前,Matlab、Scala、R、Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明确了,特别是前两天 Facebook 开源了 PyTorch 之后,Python 作为 AI 时代头牌语言的位置基本确立,未来的悬念仅仅是谁能坐稳第二把交椅。 #6. 自动化运维——问问中国的每个运维人员,运维人员必须会的语言是什么?10个人相信会给你一个相同的答案,它的名字叫Python #7. 金融分析——我个人之前在金融行业,10年的时候,我们公司写的好多分析程序、高频交易软件就是用的Python,到目前,Python是金融分析、量化交易领域里用的最多的语言 #8. 科学运算—— 你知道么,97年开始,NASA就在大量使用Python在进行各种复杂的科学运算,随着NumPy, SciPy, Matplotlib, Enthought librarys等众多程序库的开发,使的Python越来越适合于做科学计算、绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛 #9. 游戏开发——在网络游戏开发中Python也有很多应用。相比Lua or C++,Python 比 Lua 有更高阶的抽象能力,可以用更少的代码描述游戏业务逻辑,与 Lua 相比,Python 更适合作为一种 Host 语言,即程序的入口点是在 Python 那一端会比较好,然后用 C/C++ 在非常必要的时候写一些扩展。Python 非常适合编写 1 万行以上的项目,而且能够很好地把网游项目的规模控制在 10 万行代码以内。另外据我所知,知名的游戏<文明> 就是用Python写的
-
四、Python的运行方式
#进入解释器的交互式模式:调试方便,无法永久保存代码,多用于调试 #脚本文件的方式(使用nodpad++演示):永久保存代码;例:python first.py #强调:python解释器执行程序是解释执行,即打开文件读内容,因此文件的后缀名没有硬性限制,但通常定义为.py结尾;
-
五、变量
什么是变量? #变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态。 为什么要有变量? #程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。 #例如:英雄的等级为1,打怪升级(变)为10;僵尸的存活状态True,被植物打死了,于是变为False
#变量名(相当于门牌号,指向值所在的空间),等号,变量值 # age = 18 # 变量名 指向值所在的内存空间堆区地址 # 赋值符号 =:将值与变量名绑定在一起 # 变量值 存放在内存空间中的栈区
变量的规范:
#1. 变量名只能是 字母、数字或下划线的任意组合 #2. 变量名的第一个字符不能是数字 #3. 关键字不能声明为变量名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
定义方式:
#驼峰体 AgeOfSimon = xx #下划线(推荐使用,通过变量名可以知道变量的用途) age_of_simon = xx
定义变量名的不好方式:
#1. 变量名为中文、拼音 #2. 变量名过长 #3. 变量名词不达意
变量三要素:id,type,value
1 value 变量值 2 id 变量值的内存地址号,用来反映变量值在内存中的位置 3 type 值得数据类型 注:新建值,系统就会开辟空间存放该值,但存在python的优化机制,当变量值简单时,python会沿用之前的变量值
#强调 #1.id相同,意味着type和value必定相同 #2.value相同type肯定相同,但id可能不同,如下 #变量简单 >>> x = 'xc' >>> y = 'xc' >>> id(x) 35544008 >>> id(y) 35544008 >>> >>> x == y True >>> x is y True #变量复杂 >>> x = 'Info simon:18' >>> y = 'Info simon:18' >>> id(x) 42862960 >>> id(y) 42863024 >>> >>> x == y True >>> x is y False #n1和n2的关系: >>> n1 = 123456 >>> n2 = n1 >>> id(n1) 34570032 >>> id(n2) 34570032 >>> n1 123456 >>> n2 123456 >>> n1 = 123 >>> n2 123456
#1、在交互式模式下 Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被GC回收 每创建一个-5到256之间的整数,都是直接从这个池里直接拿走一个值,例如 >>> y=4 >>> id(y) >>> >>> x=3 >>> x+=1 >>> id(x) #在pycharm中 但在pycharm中运行python程序,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究
常量:
# 常量即指不变的量 或在程序运行过程中不会改变的量 # Python中没有专门语法代表常量,程序员约定俗成用变量名全为大写代表常量 AGE_OF_SIMON = 18
-
六、代码注释
#注释符号 单行注释: #为单行注释 多行注释: ''' 此处为注释 ''' 或者改成双引号也可以 #1. 不用全部加注释,只需要在自己觉得重要或不好理解的部分加注释即可 #2. 注释可以用中文或英文,但不要用拼音(尽量让人可以理解) #文件头注释: #!/usr/bin/env python # -*- coding: utf-8 -*-
-
七、Python的交互输入与格式化输出
#python3 input #强调:input会把用户所有的输入都存成str类型 #在python2中 input:用户输入什么类型,就存成什么类型 raw_input:等于python3的input 格式化输出: #从键盘输入姓名、性别、年龄 # 输出以下格式内容 # ------- name: tank ------- # name:tank # gender:wasai # age:3 # ---------- end ---------- # py3控制台输入的都是字符串 # 注:''与""都是表示单行字符串,没有区别,""""""可以表示单行或多行字符串 name = input('请输入姓名:') gender = input("请输入性别:") age = input("""请输入年龄:""") # %s(万能)占位符,严格遵循站位顺序 print("""------- name: %s ------- name:%s gender:%s age:%s ---------- end ----------""" % (name, name, gender, age)) #输出格式: ------- name: simon ------- name:simon gender:男 age:20 # %s本质上是为字符串站位,但是可以为所以类型数据进行站位 # %d是数字类型占位符,只能给数字数据站位,否则报错
-
八、数据类型
python的数据类型有 | 描述 | 定义 |
int | 数字(整型) | 用于标识:年龄,等级,身份证号,qq号,个数 ;age=12 |
float | 浮点型(小数) | 用于标识:工资,身高,体重;salary=3.1 |
str | 字符串 | |
bool | true和false | 用于判断真假,python经常用 |
list | 列表 | [ ] |
dict | 字典 | { } |
long | 长整型 | a = 2**64 ( python2中使用,python3中取消) |
complex | 复数型 | x=1-2j;x.imag;x.real |
-
九、基本运算符
计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算
算术运算
# python解释器可以当成计算器使用 + 加 - 减 * 乘 / 除 % 取余 5%2取余为1 ** 幂 2**3为8 // 去整除 返回整数部分 5//2为2
比较运算
假设变量为:a =10 b=20
比较对象是否相等 | a==b返回False | |
!= | 比较两个对象不相等 | a!=b返回True |
> | 大于 | a>b 返回False |
< | 小于 | a<b 返回True |
>= | 大于等于 | a>=b 返回False |
<= | 小于等于 | a<=b 返回True |
可以进行连比: >>> print(30>b>10) True
赋值运算:
假设变量为:a =10 b=20
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a+b 将运算结果赋值给c |
+= | 加法运算符 | c += a 等效于 c= c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c = a 等效于 c=c a |
//= | 取整除赋值运算符 |
交叉赋值:
m=5 n =5 m,n = n,m
逻辑运算符
描述 | 实例 | |
---|---|---|
and | 布尔 “与” and 两边条件同时为满足为真 | (a and b)返回True |
or | 布尔 “或” or 两边条件有一个及以上为真;两个假为假 | (a or b) 返回True |
not | 布尔“非” 如果x为true,则返回false;x为false,则返回true | not(a and b) 返回 false |
逻辑运算符的短路现象(重点)
# and前为假,整个表达式就为假,后面不用判断,被短路 # or前为真,整个表达式就为真,后面不用判断,被短路 res = 1 and 2 or 3 print(res) # 结果:2 res = 1 and 0 or 3 print(res) # 结果: 3 res = 1 and 0 and 3 print(res) # 结果:0 res = 1 or 0 or 3 print(res) # 结果:1 res = 1 or 0 or 3 # 重点 print(res) # 结果:1 #三者的优先级从高到低分别是:not,or,and >>> 3>4 and 4>3 or 1==3 and 'x' == 'x' or 3>3 False >>> (3>4 and 4>3) or ((1==3 and 'x' == 'x') or 3 >3)
身份运算
# is 比较的是id # == 比较的是值
-
十、流程控制之if循环
# 循环:提高开发效率,提高代码重用性,便于后期代码维护
格式:
if 条件1: 缩进的代码块 elif 条件2: 缩进的代码块 elif 条件3: 缩进的代码块 ...... else: 缩进的代码块 示例: 1.如果年龄<=18,那么说:你好;如果年龄>30,那么说:阿姨好;否则就:冲上去 Age = int(input("please input your age:")) if Age <= 18: print("你好") elif Age>30: print("阿姨好") else: print("冲上去") 2.如果:女人的年龄>=18并且<22岁并且身高>170并且体重<100并且是漂亮的,那么:表白,否则:he he he; age_of_girl=18 height=171 weight=99 is_pretty=True success=False if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True: if success: print('表白成功,在一起') else: print('什么爱情不爱情的,爱nmlgb的爱情,爱nmlg啊...') else: print("he he he")
练习: 1.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败! name = input("plese input name:") passwd = input("please input passwd:") if name == 'seven' and passwd == '123': print("登录成功") else: print('登录失败!')
-
十一、流程控制之while
1.条件循环
while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件。。。 # 如果条件为假,那么循环体不执行,循环终止 #练习,要求如下: 1 循环验证用户输入的用户名与密码 2 认证通过后,运行用户重复执行命令 3 当用户输入命令为quit时,则退出整个程序 name='simon' password='123' while True: inp_name=input('用户名: ') inp_pwd=input('密码: ') if inp_name == name and inp_pwd == password: while True: cmd=input('>>: ') if not cmd:continue if cmd == 'quit': break print('run <%s>' %cmd) break else: print('用户名或密码错误') continue #break
2.循环嵌套与Tag
tag=True while tag: ...... while tag: ........ while tag: tag=False
tag = True
while tag:
input_name = input("username:").strip()
input_passwd = input("passwd:").strip()
if input_name == name and input_passwd == passwd:
print('welcome %s login' %name)
while tag:
cmd = input('Exit please enter q>>:')
if not cmd:continue
if cmd == "q":
tag = False
continue
print('run <%s>' %cmd)
else:
print("用户名密码错误")
3.死循环
tag=True while tag: ...... while tag: ........ while tag: tag=False
4.while...else..
#与其它语言else 一般只与if 搭配不同,在Python 中还有个while ...else 语句,while 后面的else 作用是指,当while 循环正常执行完,中间没有被break 中止的话,就会执行else后面的语句
count = 0 while count <= 5 : count += 1 print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 循环正常执行完啦 -----out of while loop ------ #如果执行过程中被break啦,就不会执行else的语句啦 count = 0 while count <= 5 : count += 1 if count == 3:break print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 -----out of while loop ------
break and continue
break 终止本次循环,直接进入下一次循环 continue 跳出本次循环
while循环练习题#1. 使用while循环输出1 2 3 4 5 6 8 9 10
#1:使用while循环输出1 2 3 4 5 6 8 9 10
#2. 求1-100的所有数的和 #3. 输出 1-100 内的所有奇数 #4. 输出 1-100 内的所有偶数 #5. 求1-2+3-4+5 ... 99的所有数的和 #6. 1)实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
2)密码输错三次退出
3)实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次;
#7:猜年龄游戏 要求: 允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出 #8:猜年龄游戏升级版 要求: 允许用户最多尝试3次 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 如何猜对了,就直接退出
#题一 count=1 while count <= 10: if count == 7: count+=1 continue print(count) count+=1 #题二 count = 1 res = 0 while count <= 100: res += count count += 1 print(res) #题三 count = 0 while count < 100: count += 1 if count % 2 == 1: print("loop",count) #题四 count = 0 while count <= 100: count += 1 if count % 2 == 0: print("loop",count) #题五 res=0 count=1 while count <= 5: if count%2 == 0: res-=count else: res+=count count+=1 print(res) #题六 #1) db_name = "seven" db_passwd = "123" count = 0 while count < 3: name = input("plese input name:") password = input("please input passwd:") if name == db_name and password == db_pass: print("登录成功") else: print("登录失败") count += 1 #2)当时的另一种思路 name = input("plese input name:") count = 0 if name == "db_name: while count < 3: password = input("please input passwd:") if password == db_passwd: print("登录成功") else: print("登录失败") count += 1 else: print("用户名错误") #3) db_passwd = "123" count = 0 while count < 3: name = input("plese input name:") password = input("please input passwd:") if (name == "seven" or name == "alex") and password == db_passwd: print("登录OK") break else: print("登录失败") count += 1 #题七
#题7 count = 0 age = 30 while count < 3: guss_age = int(input("please input your age>>:")) if guss_age == age: print("you guessed right") break else: print("you guessed error") count += 1 #题八 count = 0 age = 30 while True: if count == 3: choice = input("继续(Y/N)>>:") if choice == 'Y': count = 0 elif choice == 'N': break guss_age = int(input("please input your age>>:")) if guss_age == age: print("you guessed right") break else: print("你猜错了") count += 1
-
十二、流程控制之for
1 迭代式循环:for,语法如下 for i in range(10): 缩进的代码块 2 break与continue(同上)
3.循环嵌套
打印乘法口诀表
# end=' ' 结尾加换行
for i in range(1,10):
for j in range(1,i+1):
print('%s*%s=%s' %(i,j,i*j),end=' ')
print()
''' #max_level=5 * #current_level=1,空格数=4,*号数=1 *** #current_level=2,空格数=3,*号数=3 ***** #current_level=3,空格数=2,*号数=5 ******* #current_level=4,空格数=1,*号数=7 ********* #current_level=5,空格数=0,*号数=9 #数学表达式 空格数=max_level-current_level *号数=2*current_level-1 ''' #实现 max_level=5 for current_level in range(1,max_level+1): for i in range(max_level-current_level): print(' ',end='') #在一行中连续打印多个空格 for j in range(2*current_level-1): print('*',end='') #在一行中连续打印多个空格 print()
练习一:
''' 基础需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 ''' db_name = ['simon','xc','cx'] db_pass = [123,321,312] count = 0 while count < 3: username = input("please input your name:") if username in db_name: tag =0 while tag < 3: passwd = int(input("please input your passwd:")) if passwd == db_pass[db_name.index(username)]: print("欢迎登陆成功") break else: print("登陆失败2") tag += 1 continue break else: print("登陆失败") count += 1
练习二:
升级需求:
可以支持多个用户登录 (提示,通过列表存多个账户信息)
用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
#db.txt内容:egon1|egon2| dic={ 'egon1':{'password':'123','count':0}, 'egon2':{'password':'123','count':0}, 'egon3':{'password':'123','count':0}, } count=0 while True: name=input('u>>: ') if name not in dic: print('用户不存在') continue with open('db.txt','r') as f: lock_users=f.read().split('|') if name in lock_users: print('用户%s已经被锁定' %name) break if dic[name]['count'] > 2: print('尝试次数过多,锁定') with open('db.txt','a') as f: f.write('%s|' %name) break password=input('p>>: ') if password == dic[name]: print('登录成功') break else: print('用户名或密码错误') dic[name]['count']+=1