因最近工作需要,所以打算重新看一遍python;以前只是零零碎碎的看了一些教程,包括书籍、官方文档、视频,现在打算以《Python编程:从入门到实践》这本书重新过一下;博客主要记录一些重点和Q&A。
这是Python官方给的IDE,是一个非常轻量级的编辑工具,大小只有20-30M,相应的功能也非常少,这里我们使用pycharm。
如果想在pycharm上运行交互式shell,需要安装相关插件,或者直接在cmd下运行python交互;
对于ubuntu系统,旧版的ubuntu默认安装python2,新版的ubuntu20.04默认安装python3(香)。
Q:Python中单引号’和双引号”有什么区别
A:Python中单引号和双引号是一样的
message = "One of Python's strengths is its diverse community." #true
print(message)
message = 'One of Python's strengths is its diverse community.' #error
print(message)
message = 'One of Python"s strengths is its diverse community.' #true
print(message)
message = "One of Python"s strengths is its diverse community." #error
print(message)
message = 'One of Python"s"strengths is its diverse community.'
#例如这里,想要输出一对双引号可以用单引号操作
正确使用单引号和双引号避免错误
Q:Python语言的历史发展
Q:相较于Python2,Python3做了哪些改进
Q:Python和C++语言的区别
变量大小写
name = "ada lovelace"
print(name.title()) ##output:Ada Lovelace 首字母大写
print(name.upper()) #output:ADA LOVELACE 全变成大写
print(name.lower()) #output:ada lovelace 全变成小写
删除空白
favorite_language = ' python '
print(favorite_language.rstrip()) #删除后空格
print(favorite_language.lstrip()) #删除前空格
print(favorite_language.strip()) #前后空格均删除
类型转换
age =23
b=str(age) #age仍为int,b为string
print(24/3) #output:8.0
print(int(24/3)) #output:8
Python之禅 python编程原则
关于注释
‘’’
在程序开头加注释,姓名和当前日期,再用一句话阐述程序的功能。
‘’’
Q:Python语法风格及命名规范
A:python 规范:PEP 8 ;缩进:四个空格;每行都不要超过80字符
代码规范:在条件测试的格式设置方面,PEP 8提供的唯一建议是,在诸如== 、>= 和<= 等比较运算符两边各添加一个空格,例如,if
age < 4: 要比if age<4: 好。
PEP 8: https://www.python.org/dev/peps/pep-0008/.
列表:由一系列按特定顺序排列的元素组成;
注意点:
1、用方括号([] )来表示列表,并用逗号来分隔其中的元素;
2、列表的索引从0而不是1开始;
3、Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1 ,可让Python返回最后一个列表元素:同理-2是倒数第二个,-3是倒数第三个;
4、列表是动态的。
修改列表内容
#添加元素
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.append('ducati') #将元素添加在列表末尾
#插入元素
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(0, 'ducati') output:['ducati', 'honda', 'yamaha', 'suzuki']
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(5, 'ducati') #大于2都会放在末尾
#删除元素
motorcycles = ['honda', 'yamaha', 'suzuki']
del motorcycles[1] #删除第二个元素
motorcycles = ['honda', 'yamaha', 'suzuki']
popped_motorcycle = motorcycles.pop() #pop挤压出最后一个元素 suzuki 给popped_motorcycle
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0) #pop出任意位置的元素,并赋值给first_owned
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
motorcycles.remove('ducati') #根据值删除元素,多个只会删除第一个
组织列表
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort() #对列表cars进行首字母排序
#cars.sort(reverse=True) #或者这样 反序排列
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(sorted(cars)) #临时排序,只体现当前一次
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.reverse() #元素顺序反转
列表长度
cars = ['bmw', 'audi', 'toyota', 'subaru']
len(cars) #output:4
遍历列表
#for循环遍历
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
output:
alice
david
carolina
#Q:这里为什么自动换行了?
数值列表(列表中内容为数字)
a = range(1,5) #range不包含结束的那个数值
print(a) #output:range(1, 5) 这里a到底是什么
#range(2,11,2) 最后一个2代表步长
#使用range() 创建数字列表
a = list(range(1,5))
print(a) #output:[1, 2, 3, 4]
数值数列统计
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(min(digits))
print(max(digits))
print(sum(digits))
列表解析
squares = [value**2 for value in range(1,11)]
print(squares) #这里for循环没有冒号,工程中常见语法形式
#output:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
切片–处理列表的部分元素
#创建切片
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3]) #和range函数一样,不包含最后一位
print(players[:4]) #没指明就是从头开始
print(players[-3:]) #返回最后三个
复制列表
#复制的话就有一个问题,两个列表是否是指向同一个地址空间
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:] #这样的话是两个列表
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods #这样直接赋值的话是一个列表(同一个地址空间)
元组–不可修改的列表
#定义元组 元组是使用圆括号来标识的。
dimensions = (200, 50)
dimensions = (200, 50)
dimensions = (400, 100) #这种重新对一个数组进行赋值是不会错的
检查特定值是否包含在列表中
requested_toppings = ['mushrooms', 'onions', 'pineapple']
print('mushrooms' in requested_toppings) #output:True
print('pepperoni' in requested_toppings) #output:False
#另外检查一个元素不在列表里可以用 not in
if语句语法结构
if conditional_test:
do something
elif conditional_test:
do something
else:
do something
字典:够将相关信息关联起来
基本特征:
1、字典 是一系列键—值对 。每个键 都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值;
2、字典用放在花括号{} 中的一系列键—值对表示,如:alien_0 = {‘color’: ‘green’, ‘points’: 5}
3、键和值之间用冒号分隔,而键—值对之间用逗号分隔。
字典基本语法
#访问键中的值
alien_0 = {
'color': 'green'}
print(alien_0['color']) output: green
#添加键值对
alien_0 = {
'color': 'green', 'points': 5} #直接添加新的键值对
alien_0['x_position'] = 0
alien_0['y_position'] = 25
#修改值
alien_0 = {
'color': 'green'} #直接复制修改
alien_0['color'] = 'yellow'
#删除键值对
alien_0 = {
'color': 'green', 'points': 5}
del alien_0['points']
遍历字典
#遍历所有的键—值对
user_0 = {
'username': 'efermi','first': 'enrico','last': 'fermi',}
for key, value in user_0.items():
do something
#遍历字典中的所有键 键重复的时候不重复输出
favorite_languages = {
'jen': 'python','sarah': 'c','edward': 'ruby','phil': 'python',}
for name in favorite_languages.keys(): #= for name in favorite_languages:
do something
#排序遍历
for name in sorted(favorite_languages.keys()):
#遍历字典中的所有值 值重复的时候不重复输出
for language in set(favorite_languages.values()):
嵌套
#在列表中嵌套字典
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',},
}
Q:可以反向用值找键吗?
A:见遍历;
Q:每个键是不是必须对应一个值,能否对应多个值?
Q:可以直接修改键吗?
Q:键名是否可以重复?
A:可以;
Q:字典可以合并吗?
用户输入函数input()
message = input("Tell me something, and I will repeat it back to you: ")
print(message) #默认为字符串
message = int(message) #如需确定接受整形,可强制类型转换
while函数
#简单语法
while conditional_test:
do something
#break 立即退出while 循环,不再运行循环中余下的代码
while True:
city = input(prompt)
if city == 'quit':
break
else:
print("I'd love to go to " + city.title() + "!")
#contine 结束本次循环,开始下一次循环
current_number = 0
while current_number < 10:
current_number += 1
if current_number % 2 == 0:
continue
print(current_number)
#若程序不小心陷入无限循环下,ctrl+c
#遍历列表
unconfirmed_users = ['alice', 'brian', 'candace']
while unconfirmed_users:
do something
#遍历寻找列表元素删除
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
while 'cat' in pets:
pets.remove('cat')
Q:有只提示,不进行输出的函数吗
input("hello,world!") #直接这样还是会等待输出
print("Give me two numbers, and I'll divide them.") #直接print
#函数简单语法
def function_name():
do something
function_name() #调用
#p.s.
def greet_user():
print("Hello!")
greet_user()
def greet_user(username): #传递信息
形参:—函数完成其工作所需的一项信息
实参:调用函数时传递给函数的信息
形参是定义函数时定义的输出变量名,实参是在调用函数时真正传进去的值。
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 get_formatted_name(first_name, last_name, middle_name=''):
if middle_name:
full_name = first_name + ' ' + middle_name + ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
musician = get_formatted_name('john', 'hooker', 'lee')
#函数返回值可以为任意结构,包括列表,字典;传递也可以传递列表,字典。
传递任意数量的实参
def make_pizza(*toppings):
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
#形参名*toppings 中的星号让Python创建一个名为toppings 的空元组,
import:将 函数 存储在 模块 中导入使用
pizza.py
def make_pizza(size, *toppings):
print("\nMaking a " + str(size) +"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
making_pizzas.py
import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
单独导入一个或多个函数
from module_name import function_name
#from module_name import function_0, function_1, function_2
from pizza import make_pizza as mp #给函数重新命名
import module_name as mn #模块重命名
from pizza import *
#导入pizza模块中所有函数,使用大型库的时候为了避免函数调用错误,通常只导入需要的函数
Q:值传递和引用传递
面向对象最重要的概念就是类了
类的概念:
1、根据类来创建对象被称为实例化;
2、类中的函数称为方法 ;
3、类中__init__()方法是一个特殊的方法,每当你根据Dog 类创建新实例时,Python都会自动运行它,且必须包括self形参;
类的基本操作
#创建类,使用类
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
继承
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self, miles):
self.odometer_reading += miles
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
导入类
from car import Car #导入类的方法和但如函数的方法是一样的
from car import Car, ElectricCar
import car #导入整个模块
from module_name import *
Q:关于类名命名规则
A:类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
文件操作
读取文件
#文件中汉字也能读取显示,想要使用文件必须先打开再能使用
with open('sss.txt',encoding='UTF-8') as file_object:
#这里打开文件要加上encoding='UTF-8'解码
contents = file_object.read()
print(contents)
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
#read会返回一个换行符,上述的话输出内容就和输入内容完全一样了
路径问题 windows下是\反斜杠,其他系统下是/
file_path = 'text_files\filename.txt' #相对路径
file_path = '/home/ehmatthes/other_files/text_files/filename.txt' #绝对路径
with open(file_path) as file_object:
逐行读取
filename = 'sss.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
写入文件
#创建文件并写入 这样的话如果文件已经存在,也会覆盖文件的内容
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
#读取模式 ('r' )、写入模式 ('w' )、附加模式 ('a' ),或者r+w这样,缺省的话在读取模式
#将内容附加到文本末
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")
异常处理(出现异常catch抛出不就行了吗==)
为什么需要异常处理:每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
try-except
#基本语法
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!") #当此处为 pass 时会不理这个错误继续运行
try:
answer = int(first_number) / int(second_number) ❷ except ZeroDivisionError:
print("You can't divide by 0!")
else: #当try成功的话会执行else
print(answer)
分析文本
#split()方法 按照空格分割成列表
title = "Alice in Wonderland"
print(title.split())
#output:['Alice', 'in', 'Wonderland']
储存数据 json --编程语言间通用数据格式
#创建json文件
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
#读取json文件内容
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
Python中unittest 模块提供了代码测试工具
文中Q后续处理…,Python后续内容整理中…
[1].《Python编程:从入门到实践》