Python是一门什么样的语言?
编译型和解释型
编译和解释的区别是什么?
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
动态语言和静态语言
动态语言和静态语言的区别是什么?
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
Python解释器
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
-
CPython
当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。 -
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Python安装
- Windows
1. 下载安装包
https://www.python.org/downloads/
2. 安装
默认安装路径:C:\python27
3、配置环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path的一行,双击】 --> 【Python安装目录追加到变值值中,用;分割】
第一个Python程序
(venv) C:\Users\win10\PycharmProjects\Py_road>python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World!")
Hello World!
变量
申明变量
name = "ZhuYuLiang"
上述代码声明了一个变量,变量名为: name,变量name的值为:"ZhuYuLiang"
- 定义规则
- 变量名只能是 字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- 以下关键字不能声明为变量名
['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']
常量
Python不存在常量,只是使用全部大写的变量名来表示常量
字符编码
ASCII(Python2默认)
python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号。
Unicode(Python3默认)
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16=65536,注:此处说的的是最少2个字节,可能更多 UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...
注释
当行注视:# 被注释内容
多行注释:""" 被注释内容 """
用户交互
#name = raw_input("What is your name?") #only on python 2.x
name = input("What is your name?")
print("Hello " + name )
输出:"Hello ZhuYuLiang"
格式化输出
1.字符串拼接
python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
name='zyl'
print('My name is '+name+' My job is IT')
My name is zyl My job is IT
2.%s,%d,%f
name = "zyl"
print "i am %s " % name
输出: i am zyl
PS: 字符串是 %s;整数 %d;浮点数%f
3.format
-
通过关键字
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com")) #通过字典设置参数 site = {"name": "菜鸟教程", "url": "www.runoob.com"} print("网站名:{name}, 地址 {url}".format(**site)) #通过列表索引设置参数 my_list = ['菜鸟教程', 'www.runoob.com'] print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
输出结果为:
网站名:菜鸟教程, 地址 www.runoob.com 网站名:菜鸟教程, 地址 www.runoob.com 网站名:菜鸟教程, 地址 www.runoob.com
-
通过位置
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 'hello world' >>>"{1} {0}".format("hello", "world") # 设置指定位置 'world hello'
if elif else流程判断
my_age = 28
user_input = int(input("input your guess num:"))
if user_input == my_age:
print("Congratulations, you got it !")
elif user_input < my_age:
print("Oops,think bigger!")
else:
print("think smaller!")
while 循环
count = 0
while True:
print("1+1=2",count)
count +=1
else用法
count = 0
while count<3:
print("1+1=2",count)
count +=1
else:
print(count)
正常结束循环后会调用else,如果循环被break掉的话不会调用else。
for 循环
for i in range(10):
print("loop:", i )
步长
每隔一个数打印一次
for i in range(0,10,2):
print("loop:", i )
每日练习
编写登陆接口
- 输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后锁定
代码如下:
import pickle,os
info={
'wq':[123456,0],
'syf':[123456,0],
'zyl':['zgkm123456.',0]
}
def write_file():
with open('./info.txt','wb') as f:
f.write(pickle.dumps(info))
def read_file():
with open('info.txt','rb') as f:
info=pickle.loads(f.read())
return info
if not os.path.exists('./info.txt'):write_file()
info=read_file()
err_info={}
for i in range(3):
while True:
name=input("请输入用户名: ")
if name.isalpha():
passwd=input("请输入密码")
if passwd.isdigit():
break
else:
print('请输入数字')
else:
print('请输入字母')
if name in info and info[name][0] == int(passwd) and info[name][1] <= 3:
print('欢迎{}用户'.format(name))
break
elif info[name][1] == 3:
print('用户已被锁定')
break
else:
info[name][1]+=1
err_info[name]=info[name][1]+1
continue
for i in err_info:
if info[i][1] == 3:
write_file()
多级菜单
- 三级菜单
- 可依次选择进入各子菜单
代码如下:
city_dict = {'广州': {'天河': ['天河体育馆', '金山大夏'],
'越秀': ['越秀公园', '光孝寺'],
'番禺': ['长隆欢乐世界', '大夫山']},
'深圳': {'福田': ['莲花山', '赛格'],
'龙华': ['元山公园', '龙城广场'],
'南山': ['世界之窗', '欢乐谷']},
'佛山': {'禅城': ['梁园', '孔庙'],
'南海': ['千灯湖', '南国桃园'],
'顺德': ['清晖园', '西山庙']}}
def judge_index(index):
if not index.isdigit() or index not in ['0','1','2']:
print('输入错误,请重试')
return 'continue'
def list_index(index):
for i in index:
for j in i:
print(j,end=' ')
print()
while True:
city_index = [(index, key) for index, key in enumerate(city_dict)]
print('欢迎查询城市信息')
print('-'*40)
list_index(city_index)
get_city=input('请输入索引: ')
if judge_index(get_city) == 'continue':
continue
city_index1 = [(index, key) for index, key in enumerate(city_dict[city_index[int(get_city)][1]])]
while True:
list_index(city_index1)
get_city1=input('请输入索引,或按b返回上一级菜单: ')
if get_city1 == 'b':
break
elif judge_index(get_city1) == 'continue':
continue
city_index2 = [(index, key) for index, key in enumerate(city_dict[city_index[int(get_city)][1]][city_index1[int(get_city1)][1]])]
while True:
list_index(city_index2)
get_city1=input('已到结尾按b返回上一级菜单: ')
if get_city1 != 'b':
print('输入错误,请重新输入!')
continue
break
多级菜单(升级版)
city_dict = {'华为':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
'小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
'魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}
fun_info=[[],[]]
def print_menu(*args):
for i in args[0]:print(i)
if len(fun_info[0]) ==3:print('已经到底了,请返回上一级或退出')
choice=input('请选择: ')
if choice == 'b' or (choice == 'q' and len(fun_info[1]) == 0):exit()
if choice == 'q':
return fun_info[0].pop()(fun_info[1].pop())
elif choice in args[0] and len(fun_info[0]) < 3 :
fun_info[0].append(print_menu);fun_info[1].append(args[0])
print_menu(args[0][choice])
else:
print('输入错误,请重试');print_menu(args[0])
print_menu(city_dict)