Sudo apt-get install python
运行 python 或python3
Python + xx.py
Ctrl + d 退出
message = "Hello Python world!"
print(message)
message = "Hello Python Crash Course world!"
print(message)
Hello Python world!
Hello Python Crash Course world!
程序中可随时修改变量的值,而Python将始终记录变量的最新值
变变量量的的命命名名和和使使用用
在Python中使用变量时,需要遵守一些规则和指南。违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解。请务必牢记下述有关变量的规则。
1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。
2.变量名不能包含空格,但可使用下划线来分隔其中的单词。例如,变量名greeting_message可行,但变量名greetingmessage会引发错误。
3.不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如print
4.变量名应既简短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
5.慎用小写字母l和大写字母O,因为它们可能被人错看成数字1和0。
字符串 就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号
"This is a string."
'This is also a string'
title() 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写
name = "ada lovelace"
print(name.title())
--> Ada Lovelace
要将字符串改为全部大写或全部小写
print(name.upper())
print(name.lower())
合合并并((拼拼接接))字字符符串 Python使用加号(+)来合并字符串
first_name = "ada"
last_name = "lovelace" ❶ full_name = first_name + " " + last_name
print(full_name)
ada lovela
字符串中添加制表符,可使用字符组合\t
字符串中添加换行符,可使用字符组合\n
字符串中同时包含制表符和换行符。字符串"\n\t
删除所有空白rstrip()
剔除字符串开头的空白lstrip()
剔除字符串两端的空白strip()
Python中,可对整数执行加(+)减(-)乘(*)除(/)运算
>>> 2 + 3
5
>>> 3 - 2
1
>>> 2 * 3
6
>>> 3 / 2
1.5
在Python 2中,将两个整数相除得到的结果稍有不同:
>>> python2.7
>>> 3 / 2
1
若要避免这种情况,务必确保至少有一个操作数为浮点数,这样结果也将为浮点数:
1.5
>>> 3 / 2.0
1.5
>>> 3.0 / 2.0
1.5
使用两个乘号表示乘方运算
>>> 3 ** 2
9
>>> 3 ** 3
27
以使用括号来修改运算次序
>>> 2 + 3*4
14
>>> (2 + 3) * 4
20
空格不影响Python计算表达式的方式,它们的存在旨在让你阅读代码时,能迅速确定先执行哪些运算
从很大程度上说,使用浮点数时都无需考虑其行为
>>> 0.1 + 0.1
0.2
将非字符串值表示为字符串str(非字符串)
注释用井号(# )标识。井号后面的内容都会被Python解释器忽略,
还有一种注释方法 """显示简单的问候语"""三双引号段落注释
在Python终端会话中执行命令import this
用方括号([] )来表示列表,并用逗号来分隔其中的元素。
bicycles = ['trek', 'cannondale', 'redline', 'specialized]
索引从0而不是1开始
访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1索引-2返回倒数第
二个列表元素,索引-3 返回倒数第三个列表元素
在列表末尾添加元素 motorcycles.append('ducati')
在列表中插入元素 方法insert()可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值 motorcycles.insert(0 'ducati)这种操作将列表中既有的每个元素都右
移一个位置:
从列表中删除元素:del motorcycles[0]
使用方法pop() 删除元素可删除列表末尾的元素,并让你能够接着使用它
poppedmotorcycle = motorcycles.pop()
实际上,你可以使用pop() 来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可first_owned = motorcycles.pop(0)
根据值删除元素motorcycles.remove('ducati')
方法sort() 让你能够较为轻松地对列表进行排序,永久性地修改了列表元素的排列顺序
字母顺序相反的顺序排列列表元素只需向sort() 方法传递参数reverse=True
Sort(reverse=True)
使用函数sorted() 对列表进行临时排序 print(sorted(cars))
倒着打印列表使用方法reverse(),reverse()不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序.方法reverse()永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,为此只需对列表再次调用reverse()即可。
使用函数len() 可快速获悉列表的长度
遍遍历历整整个个列列表
for magician in magicians:
print(magician)
注意缩进
range() 让你能够轻松地生成一系列的数字 range(1,5)
函数range() 让Python从你指定的第一个值开始数,并在到达你指定的第二个值
后停止实际上它不会打印数字5
要创建数字列表,可使用函数list() 将range() 的结果直接转换为列表。如果将range()作为list()的参数,输出将为一个数字列表
numbers = list(range(1,6))
使用函数range() 时,还可指定步长。
even_numbers = list(range(2,11,2)) [2, 4, 6, 8, 10]
个专门用于处理数字列表的Python函数min() , max() , sum()
列表解析:
列表解析 将for 循环和创建新元素的代码合并成一行,并自动附加新元素
squares = [value**2 for value in range(1,11)
以处理列表的部分元素——Python称之为切片
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3]) // 输出分别为0、1 和2 的元素
如果你没有指定第一个索引,Python将自动从列表开头
print(players[:4])
要让切片终止于列表末尾,也可使用类似的语法
print(players[2:])
输出名单上的最后三名队员,可使用切片players[-3:]
复制列表:
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
friendfoods = myfoods
这里将my_foods 赋给friend_foods ,而不是将my_foods的副本存储到friend_foods这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表,因此这两个变量都指向同一个列表。当我们将'cannoli'添加到my_foods中时,它也将出现在friend_foods中;同样,虽然'icecream'好像只被加入到了friend_foods中,但它也将出现在这两个列表中
Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组
圆括号而不是方括号
dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:
dimensions = (200, 50)
dimensions = (400, 100)
检查是否相等
>>> car = 'bmw'
>>> car == 'bmw'
True
if car == 'bmw' :
检查是否不相等
!=
<= >= < >
检测多个条件 and 相当于C语言 &&
Or 相应于 C语言||
判断特定的值是否已包含在列表中
requested_toppings = ['mushrooms', 'onions', 'pineapple']
If 'mushrooms' in requested_toppings:
判断特定的值是否不包含在列表中可使用关键字not in
if user not in banneduse:
布尔表达式
game_active = True
can_edit = False
if age >= 18:
else:
If age < 4:
elif age < 18:
else:
字典用放在花括号{} 中的一系列键—值对表示:
alien0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
字典是一种动态结构,可随时在其中添加键—值对。要添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值
创建一个空字典
alien0 = {}
alien_0['color'] = 'green'
alien0['points'] = 5
删除键—值对del alien_0['points']
遍历所有的键—值对
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
print("\nKey: " + key)
print("Value: " + value)
遍历字典中的所有键方法keys()
按顺序遍历字典中的所有键可使用函数sorted() 来获得按特定顺序排列的键列表的副本
遍历字典中的所有值values()
去除重复数据:set(xxx)
字典列表
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
aliens = [alien_0, alien_1, alien_2]
字典中存储列表
pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
字典中存储字典
users = {
'aeinstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton',
},
'mcurie': {
'first': 'marie',
'last': 'curie',
'location': 'paris',
},
}
函数input() 让程序暂停运行,等待用户输入一些文本
是Python 2.7,应使用函数raw_input()来提示用户输入
int() 将这个字符串转换成了数值表示
求模运算符
>>> 4 % 3
1
while 循环
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
break 退出循环
在任何Python循环中都可使用break语句。例如,可使用break语句来退出遍历列表或字典的for循环
要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句
定义函数:
def greet_user():
"""显示简单的问候语"""
#显示简单的问候语
print("Hello!")
greet_user()
向函数传递信息:
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('jesse')
关键字实参:
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
这样顺序就可以颠倒了
默认值:
def describe_pet(pet_name, animal_type='dog'):
也可以调用修改
Describe_pet(pet_name='harry', animaltype='hamste)
返回简单值
可使用return 语句将值返回到调用函数的代码行
return full_name.title()
返回字典
person = {'first': first_name, 'last': last_name}
return person
传递列表
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
// 特殊点:
age=''
if age:
while True:
在在函函数数中中修修改改列列表表:
相当于指针:
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
禁止函数修改列表
functionname(listname[:]) 副本
传递任意数量的实参:
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
形参名*toppings 中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中
如果前面的函数还需要一个表示比萨尺寸的实参,必须将该形参放在形参*toppings的前面:
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Python将收到的第一个值存储在形参size中,并将其他的所有值都存储在元组toppings中
将函数存储在模块中:
模块 是扩展名为.py的文件,包含要导入到程序中的代码
pizza.py
def make_pizza(size, *toppings):
making_pizzas.py
import pizza
pizza.make_pizza(16, 'pepperoni')
只需编写一条import 语句并在其中指定模块名,就可在程序中使用该模块中的所有函数
如果你使用这种import 语句导入了名为module_name.py 的整个模块,就可使用下面的语法来使用其中任何一个函数:module_name.function_name()
导入特定的函数:
from module_name import function_name
from module_name import function_0, function_1, function_2
若使用这种语法,调用函数时就无需使用句点。由于我们在import语句中显式地导入了函数make_pizza(),因此调用它时只需指定其名称
from pizza import make_pizza
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
使用as 给函数指定别名:
from pizza import make_pizza as mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
这可避免与这个程序可能包含的函数make_pizza()混淆。
给模块指定别名:
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
导入模块中的所有函数:
from pizza import *
make_pizza(16, 'pepperoni')
makepizza(12, 'mushrooms', 'green peppers', 'extra cheese)
应给函数指定描述性名称,且只在其中使用小写字母和下划线
创建和使用类:
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
1. 方法__init__()开头和末尾各有两个下划线,这是一种约定每当你根
据Dog 类创建新实例时,Python都会自动运行它
我们将方法__init__() 定义成了包含三个形参:self 、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包
含形参self 呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身
的引用,让实例能够访问类中的属性和方法。我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄;self会自动传递,
因此我们不需要传递它。每当我们根据Dog 类创建实例时,都只需给最后两个形参(name和age )提供值。
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".") ❸ print("My dog is " + str(my_dog.age) + " years old.")
1. 访问属性
(1) my_dog.name
(2) my_dog.age
(3) my_dog.sit()
(4) my_dog.roll_over()
给属性指定默认值:
class Car():
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
方法修改属性的值
导入单个类:
from car import Car
my_new_car = Car('audi', 'a4', 2016)
从一个模块中导入多个类
from car import Car, ElectricCar
导入整个模块
import car
my_beetle = car.Car('volkswagen', 'beetle', 2016)
导入模块中的所有类
from module_name import *
不推荐使用这种导入方式,其原因有二。首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有裨益;但这种导入方式没有明确地指出你
使用了模块中的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。这里之所以介绍这种导
入方式,是因为虽然不推荐使用这种方式,但你可能会在别人编写的代码中见到它
类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线
实例名和模块名都采用小写格式,并在单词之间加上下划线
读取整个文件:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
关键字with 在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open() ,但没有调用close()但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
文件路径:
file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
逐行读取:
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
创建一个包含文件各行内容的列表:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
使用方法replace() 将字符串中的特定单词都替换为另一个单词
>>> message = "I really like dogs."
>>> message.replace('dog', 'cat')
'I really like cats.’
写入文件:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式
写入多行
函数write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
附加到文件
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")
异常处理:
try-except代码块
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
try-except-else 代码块
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
存储数据:
JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用
模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
看看其内容。数据的存储格式与Python中一样:
[2, 3, 5, 7, 11, 13]
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
Pygame,这是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音,让你能够更轻松地开发复杂的游戏。通过使用Pygame来处理在屏幕上绘制图像等任务,
Matplotlib:
Pygal:
CSV文件格式
以以逗号分隔的值 (CSV)
requests包让Python程序能够轻松地向网站请求信,息以及检查返回的响应。要安装requests,请执行类似于下面的命令:
pip install --user requests
处理API响应:
import requests
# 执行API调用并存储响应
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = requests.get(url)
print("Status code:", r.status_code)
# 将API响应存储在一个变量中
response_dict = r.json()
# 处理结果
print(response_dict.keys())
Django入门
Django是一个Web框架 ——一套用于帮助开发交互式网站的工具。Django能够响应网页请求,还能让你更轻松地读写数据库、管理用户等
python -m venv ll_env
pip install --user virtualenv
设置项目“学习笔记”的样式
pip install django-bootstrap3
疑问点:
1.
def build_profile(name,**userinfo):
profile={}
profile["name"]=name
for key,value in userinfo.items():
profile[key]=value
return profile
profile=build_profile("yexiang",age=27,sex="man")
print(profile)
上面的结果是
{'age': 27, 'sex': 'man', 'name': 'yexiang'}
如果把profile["name"]=name 改为 profile[‘name’]=name
结果是{'name': 'yexiang', 'sex': 'man', 'age': 27}
不知道这是为什么。双引号和单引号不是一样的么
增强知识
字节码编译:
当程序执行时,python内部会将源代码编译成所谓的字节码的形式。.pyc格式,之后字节码发送给python虚拟机PVM 上执行,PVM就是迭代运行字节码指令的一个大循环,一个接一个的完成操作。PVM是python运行的引擎。
Python字节码不是机器的二进制代码,字节码是特定于python的一种表现形式
CPython:一般安装的就是这个
JPython: 包含了JAVA类,这些类编译Pthon代码形成JAVA字节码并将得到的字节码映射到JVM中去运行
IronPython : 可以与Windows平台上的.NET框架集成应用
可以定下输出到文件中
python3 test.py > test.txt
如果想像shell脚本那么运行,那么在脚本第一行添加
#!/usr/bin/python
这既可以shell 下运行。也可以和之前一样python3 xxx.py 运行
因为env程序可以通过系统搜索路径的位置
使用exec运行模块文件
例如: exec(open(“xxx.py”).read())相当于把代码复制到这里
Pdb命令行调试器
嵌套:
例如列表中嵌套列表:
M[[1,2,3], [4,5,6],[7,8,9]]
这可以使用 M[1] = [4,5,6]
列表解析源自集合概念:
Col2 = [row[1] for row in M]
= [2,5,8]
上面的意思就是把矩阵M的每个row中的row[1],放到一个新的列表中去,结果就是一个包含了矩阵的第二列的新列表
当一个列表或者字典不需要的时候释放空间 可以这样 M = 0 ,从技术上说,Python有一种叫做垃圾收集的特性。Python中一旦一个对象的最后一次引用被移除,空间将会被立即收回
字符串格式化:
如: “{0:o},{1:x},{2.b}”.format(64,64,64) = “100,40,1000000”
“%o,%x,%X” % (64,255,255) = “100,ff,FF”
print ("All partition files in %s partition are the same!\n" % (cuspartition))
=
All partition files in 5 partition are the same!
集合:set
X = set(“abcde”)
Y = set(“bdxyz”)
X = set([“a”,”b”,”c”.”d”,”e”])
集合通过表达式操作符支持一般的数学集合运算:
“e“ in X
True
X-Y // different
Set([“a”,”c”,”e”])
X|Y // union
Set([“a”,”c”,”b”,”e”,”d”,”y”,”x”,”z”])
X&Y // same
Set([”b”,”d”])
X^Y // 去除相同
Set([“a”,”c”,”e”,”y”,”x”,”z”])
X>Y, X<Y
(False,False)
Add, remove,等
For item in set(“abc”):
Print(item*3)
= aaa
Ccc
Bbb
为什么不是 aaa bbb ccc
那是因为集合是无序的并不包含位置顺序,所以上面的结果每次执行都不固定的
Python 中的bool类型值是 True,False而不是 1和0,但是可以看成1 和0
True+4 = 5
Python中类型是在运行过程中自动决定的,这意味着没必要事先声明变量
变量,对象,引用:
运行a=3后,变量a变成对象3的一个引用,在内部,变量事实上是到对象内存空间的一个指针,python中变量到对象的连接称为引用,也就是说,引用是一种关系。以内存中的指针的形式实现,一旦变量被使用(也就是说被使用),python自动跟随这个变量到对象的连接
1. 变量是一个系统表的元素,拥有指向对象的连接的空间
2. 对象是分配一块内存,有足够的空间去表示它们所代表的值
3. 引用是自动形成的从变量到对象的指针
举例:
A = 3
A = ‘hello’
A = 1.234
变量名A没有类型,这里只是把A指向了不同的对象的引用,对象都知道自己的类型,每个对象都包含了一个头部信息,标记了对象的类型 ,还有引用计数器
对象垃圾回收:
当A = 3 之后 A = ‘hello’ ,每当一个变量名被赋予了一个新的对象,之前的那个对象占用的空间会被回收,这种自动回收对象空间的技术叫做垃圾收集,因为对象的引用计数器为0
共享引用:
A = 3
B = A
A = 3
B = A
A = ‘spam’
列表也是一种对象
这里相对于C++中的浅拷贝
这里相对于C+++的深拷贝
分片技术一般只用于列表,列表是有序的,字典和集合是无序的,
两种方法去检查是否相等
== , is操作符
== 比较的是对象是否有相同的值
Is 操作符是检查对象是否指向同一个对象
字符串是一个有序的字符的集合, 列表和元组也是有序的
“”, ‘’ 都表示空字符串
三重引号:””” “”” 是一种编写多行文本数据的便捷方法。
列表分片三个值:
X[I:J:K]
从 I 到 J-1 每隔K元素索引一次,K默认为1