python是一门强大的面向对象的程序设计语言。它的效率极高:使用其他语言时,需要上百行的语句,python往往只需要几十行就够了。python的语法有助于创建优美、工整、可读性强的代码。
人们将python运用于许多方面:编写游戏、web开发、科学计算等等等等。总而言之python是一门十分强大的语言,非常值得我们学习。尤其是在人工智能如此火爆的当下,人人都应该学会python。
在下文及以后的文章中,都将使用python3进行描述。
python中要储存数据需要用到变量。
变量的声明与使用如下:
greeting = "Hello python world!"
print(greeting)
第一行代码将"Hello python world!"这个字符串储存到变量greeting中。
第二行代码则将变量greeting中储存的字符串打印出来。
在python中我们不需要像c++,java一样指定变量的类型,变量的类型可以在程序运行时改变。但这并不意味着python是一门类似PHP的弱类型语言,与之相反,python是一门强类型的动态语言。一门语言是强类型语言,意味着这门语言是类型安全的,比如在Python中,有如下定义:
m = "3"
在这段代码中,m的类型为字符串,此时的程序是不允许这样的运算的:
n = m + 1
若是这样输入,python会报错:
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't convert 'int' object to str implicitly
意思是不能将字符串对象隐式转换为整型变量。这表明python是类型安全的。即python是一门强类型语言。
再来看下面的代码:
m = "3"
m = 3
在第一行中,我们将"3"赋给了变量m,此时m类型为str,即字符串类型。
但在第二行中,我们又将整型变量3赋给了变量m,这样可以吗?
答案是可以的,python支持动态类型转换,python是一门动态语言。
在python中,我们用print语句来向控制台输出
语法如下
print("Hello python world!")
括号内的内容需要是字符串,但python中许多对象可以直接输出,比如:
print(3.1415926)
在控制台直接输出3.1415926,而不需要用str()显示转换为字符串,python已经帮我们做好了.
又比如:
list = [1, 2, 3]
print(list)
第一行中List是一个列表,第二行中将这个列表输出,得到的结果是[1, 2, 3],这个结果让人觉得非常舒服。
在python中使用input函数实现数据的交互:
username = input("username:")
password = input("password:")
input括号中的字符串为你想在终端中提示的字符串,比如username = input(“username:”)在终端中显示:
username:
之后输入的数据将被保存在变量username中。
input函数在输入时是明文显示的,这在需要输入密码等敏感信息的时候很不方便,为此可以使用getpass模块中的函数。
在文件的开头加入如下语句:
import getpass
再将原代码修改为:
password = getpass.getpass("password:")
在终端输出与使用input时一样,但是输入数据时终端不会显示已输入的文字。
可以用if-else语句实现流程控制,具体使用如下:
age = 16
if age > = 18:
print("你已经成年啦!")
else:
print("你还没有成年哦")
第一行中创建了一个变量用来储存年龄,第二行对age的大小进行判断,如果age的数值大于等于18,那么执行下个缩进块中的语句,即输出:
你已经成年啦!
否则age小于18,则输出:
你还没有成年哦
if 判断语句 :
要执行的代码块
else:
条件不成立时执行的代码块
生活中常常会出现需要多种判断的情况,这时只用if-else就不够用了,此时可以用elif语句进行多重判断:
if score >= 80:
print("成绩优秀")
elif score >= 60:
print("成绩良好")
else:
print("不及格")
当成绩为80分以上时,输出成绩优秀;
成绩大于等于60分而小于80分时,输出成绩良好;
成绩小于60时,输出不及格。
python通过缩进来判定语句之间的关系,如上例中,第三行进行了缩进,他表示如果if中的判断成立,那么执行该代码块。
如果没有缩进:
age = 16
if age > = 18:
print("你已经成年啦!")
else:
print("你还没有成年哦")
程序无法执行,python会提醒你不要忘记缩进:
File "", line 2
print("你已经成年啦!")
^
IndentationError: expected an indented block
这种强制缩进的语法很好的增加了代码的可读性;简而言之,这种语法使你的代码更加整洁和清晰。
养成良好缩进的习惯,不论在什么语言中都有巨大的作用。
while循环是流程控制中的一种,其基本使用方式如下:
while 循环条件 :
条件满足时执行的代码块
示例代码如下:
不到最后一刻不停止学习
energy = 100
while energy > 0:
print("继续学习")
energy = energy - 1
第一行中创建了一个表示我们精力的变量energy,它的值是100。
第二行中while循环判断energy是否大于0,若是,执行对应的代码块,在这里是输出“继续学习”。
第四行使循环变量energy减1。执行完第四行语句后,程序回到第二行处,判断此时循环变量energy是否还满足条件,若是,继续执行对应代码块…以此类推,直到循环变量energy不满足条件为止。
到程序运行结束,一共输出了100行“继续学习”的字符。
使用else进行更多操作
在上例中,如果想要在循环结束时额外进行操作,可以用如下的代码:
energy = 100
while energy > 0:
print("继续学习")
energy = energy - 1
else:
print("学累了,睡觉")
上述代码在energy变为0后,还额外输出了一条“学累了,睡觉”的字符串。
for循环是python中的另一种循环,与c/c++中的for循环不相同,与PHP、Java中的foreach循环类似。
其基本使用形式如下:
for 元素 in 列表 :
要执行的代码块
如:
for value in range(10):
print(value)
输出了0到9之间所有的整数。
for循环之后依然可以接上else语句进行额外操作:
for value in range(10):
print(value)
else:
print("数完了")
在输出完所有数字后再输出一行“数完了”的字符串。
首先要求用户输入用户名和密码:
import getpass
username = input("username:")
password = getpass.getpass("password:")
然后对用户名及密码进行判断:
...
if username == "xiaoming" and password == "123456":
print("欢迎您,", username)
else:
print("用户名或密码错误!")
当输入用户名为xiaoming及密码为123456时提示欢迎信息,否则提示用户名或密码错误。
我们想提示用户名及密码错误时让用户重新输入而不是结束程序,于是我们在程序中加入一个while循环,具体如下:
...
while True:
username = input("username:")
password = getpass.getpass("password:")
if username == "xiaoming" and password == "123456":
print("欢迎您,", username)
break
else:
print("用户名或密码错误!")
continue
加入while循环实现流程控制,当输入正确时,输出欢迎信息并退出程序,当输入不正确时输出错误信息并要求用户重新填写。
从文件中读取用户信息
我们希望在文件中读取用户名和密码信息,将代码改成如下形式:
...
import json
users_path = "users.json"
users = {}
with open(filename) as file_object:
users = json.load(f_obj)
while True:
username = input("username:")
if username not in users.keys():
print("用户不存在")
continue
while True:
password = getpass.getpass("password:")
if users[username] == password:
print("欢迎您,", username)
break
else:
print("密码错误!")
continue
在文件开头导入json模块,使得程序能够从json文件中读取信息。
在接下来几行中,我们创建了变量user_path用来储存用户名文件的地址;users变量用于储存从json文件中读取的数据。然后我们用open函数来打开文件,用json.load函数来解析该文件,并将解析的结果储存在user中。在输入用户名以后,我们检测所输入的username是否存在于字典users中,若不存在则提示一条信息并重新输入。若用户名存在,那么输入密码,检测方式与上面大致相同,不同的是这次检测的是字典users中键username对应的值是否和password相同。
输入正确密码后我们希望直接退出程序,而不是输入下一个用户名,但是现在程序处于内层循环中,单纯用break已经解决不了问题了,所以我们在程序开头加入如下语句:
import sys
并且将输入正确时的语句改成如下形式:
...
if users[username] == password:
print("欢迎您,", username)
sys.exit()
...
在输入正确密码后直接退出程序。
输入三次锁定
现在我们希望用户在输入不正确的密码三次后将该用户锁定,于是在程序开头加入:
...
lock_path = "lock.json"
lock = []
with open(lock_path) as file_object:
lock = json.load(file_object)
...
将锁定的名单保存在lock.json文件中,并将文件中的信息读取到lock中。
在用户名检测时增加对锁定用户的检测:
...
if username not in users.keys():
print("用户不存在")
continue
elif username in lock:
print("该用户已被锁定")
continue
...
输入三次错误密码后将该用户锁定:
...
while True:
password = getpass.getpass("password:")
count = 0
if users[username] == password:
print("欢迎您,", username)
break
else:
print("密码错误!")
count = count + 1
if count >= 3:
print("输入三次错误密码,您的用户已被锁定!")
lock.append(username)
with open(lock_path, "w") as file_object:
json.dump(lock, file_object)
break
continue
我们创建了一个用来储存错误次数的变量count,并在每次输入错误时将count加1,当count大于等于3时,提示用户将要锁定用户,并将该用户名加入lock列表中,然后储存在lock.json中,最后退出循环,程序重新回到输入用户名处。
全部代码如下:
import sys
import json
users_path = "users.json"
lock_path = "lock.json"
users = {}
lock = []
with open(filename) as file_object:
users = json.load(f_obj)
with open(lock_path) as file_object:
lock = json.load(file_object)
while True:
username = input("username:")
if username not in users.keys():
print("用户不存在")
continue
while True:
password = getpass.getpass("password:")
if users[username] == password:
print("欢迎您,", username)
sys.exit()
else:
print("密码错误!")
count = count + 1
if count >= 3:
print("输入三次错误密码,您的用户已被锁定!")
lock.append(username)
with open(lock_path, "w") as file_object:
json.dump(lock, file_object)
break
continue
首先创建各级子菜单:
# 中国省份
china = {}
# 广东
gd = {}
# 广州
gz = ["天河区", "越秀区", "花都区"]
gd["广州"] = gz
china["广东"] = gd
作为例子的是全国的省、市、区三级菜单,为方便起见我们这里只用广东省广州的菜单。上述程序中我们创建了一个储存全国省份的字典china,一个储存广东所有市的字典gd,还有一个储存广州所有区的列表gz。在后面的代码中,我们将列表与字典一一嵌套,形成一个完整的省、市、区三级菜单。
接下来我们完成菜单的选择部分:
在程序开头加入:
import sys
然后在程序中加入
...
while True:
for province_name in china.keys():
print(province_name)
province = input("请输入要选择的省:")
# 如果有这个省
if province in china.keys():
current_list = china[province]
for city_name in current_list:
print(city_name)
while True:
city = input("请输入要选择的市:")
# 如果有这个市
if city in current_list.keys():
current_list = current_list[city]
while True:
for area_name in current_list:
print(area_name)
area = input("请选择要输入的区:")
# 如果有这个区
if area in current_list:
print("您选择的是:", province, city, area)
sys.exit()
else:
print("没有这个区!请重输!")
continue
else:
print("没有这个市!请重输!")
continue
else:
print("没有这个省!请重输!")
continue
在程序开头我们输出所有省的名称供用户选择,随后提示用户输入所要选择的省的名称,如果该省存在,那么进入下一步,否则重新输入要选择的省的名称…以此类推当选择完省、市、区三级后输出用户所选择的信息,程序结束。
在程序中,我们使用了current_list来储存当下操作的字典或列表,以增加代码的清晰度。
我们希望在输入时能有一些快捷键供我们对程序进程做一些操作,我们可以在每条input的if-else语句中增加一些语句:
...
if area in current_list:
print("您选择的是:", province, city, area)
sys.exit()
elif area == "b":
break
elif area == "q":
sys.exit()
else:
print("没有这个区!请重输!")
continue
...
程序全部代码如下:
import sys
# 中国省份
china = {}
# 广东
gd = {}
# 广州
gz = ["天河区", "越秀区", "花都区"]
gd["广州"] = gz
china["广东"] = gd
while True:
for province_name in china.keys():
print(province_name)
province = input("请输入要选择的省:")
# 如果有这个省
if province in china.keys():
current_list = china[province]
for city_name in current_list:
print(city_name)
while True:
city = input("请输入要选择的市:")
# 如果有这个市
if city in current_list.keys():
current_list = current_list[city]
while True:
for area_name in current_list:
print(area_name)
area = input("请选择要输入的区:")
# 如果有这个区
if area in current_list:
print("您选择的是:", province, city, area)
sys.exit()
elif area == "b":
break
elif area == "q":
sys.exit()
else:
print("没有这个区!请重输!")
continue
elif city == "b":
break
elif city == "q":
sys.exit()
else:
print("没有这个市!请重输!")
continue
elif province == "b":
print("已经是最上级!")
elif province == "q":
sys.exit()
else:
print("没有这个省!请重输!")
continue