目录
为什么想起学Python了?
之所以想起学学Python是有三个缘由。从时间顺序上看,首先是在10月中旬,笔者去学校招聘会走了走,发现招Python开发的挺多的,有在线教育、智慧城市等行业,基本以数据挖掘处理为主。其次是10月中旬接到了腾讯微信搜一搜后台的实习面试邀请,那边招C++和Python开发,用的是腾讯自研框架。最后也是最重要的,在11月上旬,笔者参加的电子设计大赛F题送药小车核心点在图像识别,而市面上用的比较多的OpenMV需要用Python开发。这让笔者意识到是时候该学学Python了,虽然说学好一门语言后再学第二门会很简单,但万一遇到紧急项目,总不能再花时间在语法基础上吧,项目所需要的框架也是需要学习成本的。
Python与Java?
笔者对Java比较熟练,也是以Java作为第一门语言开始学习的。有了一定开发经验后最大的感受是确实能快速上手Python,特别是面向对象那块,毕竟编程思想是可以互通的。至于以后会不会从事Python相关的开发工作,要看市场和项目需求,现阶段还是会以Java的学习为重,笔者Java还有好多好多要学的呢,Python暂时学来玩玩刷刷leetcode就好了。
参考资料:
笔者Python学习主要以《Python编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天教授的Python课程。嵩天教授的课很好,最大的特点是每个版块都有完整的示例代码。但可能对新手小白不太友好,有些不常用的函数容易弄混。《Python编程:从入门到实战》更适合零基础学习,里边会提到一些互通的编程思想和Python的格式规范。
结合常用函数、方法:
由于笔者有Java的编程基础,因此这里只记录Python跟Java不一样的地方以及一些易忘点和难点,重点放在Python的语法基础。对于新手朋友还是先看书为好。结合《Python常用函数、方法示例总结(API)》来看可能效果会好一些。
.py
指出这是一个Python程序,编辑器将使用Python解释器运行它;
Python解释器读取整个程序,确定其中每个单词含义;
程序无法成功运行时,解释器会提供一个traceback
。traceback是一条记录,指出解释器尝试运行代码时,在什么地方陷入困境;
在Python中,可以用单引号或双引号括起字符串;
Python中的转义符:
\n
换行(光标到下行首);\r
回车(光标回到本行首);\t
制表符,\n\t
表示换行并在下一行开头添加制表符;\b
回退;Python2中,有些print
语句包含括号,有些不包含;
Python使用两个乘号表示乘方,如:3 ** 2 == 9
;
Python2中除法\
将小数部分直接删除。Python3中保留小数。但在Python2中:3.0 / 2 == 1.5
;
Python之禅:Python的一些编程理念。在终端输入import this
即可获取;
Python关键字:
Python内置函数:
一个列表示例:bicycles = [ 'trek', 'cannondale', 'redline']
。注意方括号与逗号;
打印列表示例:print(bicycles)
;
访问列表元素:bicycles[0]
--- > trek;
访问列表倒数第x元素:bicycles[-x]
--- > 当x=1时输出:redline;
使用for循环遍历列表:
for object in list:
print(object)
列表解析:list = [num**2 for num in range(1s, 11)]
---> 输出1到10的平方;
遍历部分列表:for object in list[firstNum: lastNum]:
;
可以使用list[:]
的方法复制列表;
元祖相关:
()
或tuple()
或不使用括号;而列表使用[]
或list()
;如果提出修改Python语言修改建议,需要编写Python改进提案(PEP)。PEP 8是最古老的PEP之一,其规定了以下一些Python代码格式规范:
一个集合示例:bicycles = { 'trek', 'cannondale', 'redline'}
。注意大括号与逗号;
集合的特点是不能重复;
利用集合数据去重:
s = set(list) #利用集合无重复元素的特点去重
l = list(s) #将集合转变回列表
Python在检查是否相同时考虑大小写;
大部分时候检查两个指不等的效率更高;
在Python中使用and
和or
表示并与或,而不是&&
和||
;
检查列表是否含有特定值的语句:if(object in list)
,也可以用if(object not in list)
;
Python的if语句基本结构如下(注意冒号):
if conditional_test1:
do something1
elif conditional_test2:
do something2
else:
do other
判断列表是否为空:if list:
alien0 = {'color': 'green', 'points': 5}
for key, value in map.items():
for object in map.keys():
或for object in map:
,因为遍历字典默认遍历所有的键;for object in sorted(map.keys()):
for object in map.values():
for object in set(map.values()):
input()
方法,而在Python 2.7里使用raw_input()
方法;while conditional_test:
break
关键字退出循环,这里的循环包括while和for循环;continue
关键字继续循环;while object in list:
不带返回值的函数定义示例:
def greet_user(username, age=1): #username没有设定默认值必须放在形参列表开头
"""显示简单问候语"""
print("hello, " + username.title() + ", age is " + str(age))
greet_user('jesse', 18) #位置实参
greet_user(age=18, username='jesse') #关键字实参
greet_user('jesse') #使用默认值age=1
带普通返回值的函数定义示例:
def greet_user(username, age=1): #username没有设定默认值必须放在形参列表开头
"""显示简单问候语"""
print("hello, " + username.title() + ", age is " + str(age))
return username.title()
带字典返回值的函数定义示例:
def build_person(first_name, last_name): #username没有设定默认值必须放在形参列表开头
"""返回字典"""
person = {'first': first_name, 'last': last_name}
return person
传递列表参数,列表会修改:
def greet_users(names):
"""传入参数为列表"""
for name in names:
msg = "Hello, " + name.title() + "!"
print(mas)
usermanes = ['margot', 'hannah', 'ty']
greet_users(usernames)
传递列表参数的副本,列表不会修改:def greet_users(names[:]):
传递任意数量的实参:*toppings可以理解成列表;
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'etra cheese')
结合使用位置实参和任意数量实参:def make_pizza(size, *toppings):
*toppings
放在最后;使用任意数量的关键字实参:**user_info可以理解成字典;
def build_profile(name, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
profile = {}
profile['name'] = name
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', location='princeton', field='physics')
print(user_profile)
在Python中,import的是模块,使用模块.方法(参数)即可调用模块里的函数;
导入特定函数,并使用该函数示例:
from module_name import function_0, function_1
function_0()
function_1(参数)
使用as
给函数指定别名:from model import function as fn
;后续使用fn()
即可调用function函数;
使用as
给模块指定别名:import model as md
;后续使用md.function()
即可调用函数;
导入模块所有函数:from model import *
;后续直接使用model里的函数function()
即可调用函数;
可以在函数类使用global
关键字声明变量是全局变量;
lambda表达式:<函数名> = lambda <参数> : <表达式>
;
示例:
f = lambda x, y : x + y
f(10, 15)
25
f = lambda : "lambda表达式"
print(f())
lambda表达式
函数与模块编写细节:
类中的函数叫方法;
一个类示例:模块名为dog.py
"""表示小狗和电子狗的类"""
class Dog():
"""模拟小狗"""def __init__(self, name):
"""初始化实例"""
self.name = name
self.age = 1 #给属性指定默认值
def get_age(self):
"""返回年龄"""
return self.age
def set_age(self, age):
"""设置年龄"""
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
class TinyDog(Dog):
"""小狗是狗的子类"""def __init__(self, name)
"""初始化父类的属性"""
super().__init__(name)</code></pre>
__init__()
方法:形参self必不可少,而且必须位与其他参数前面;
- 创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,其是一个指向实例本身的应用,让实例能够访问类中的属性和方法;
self.
为前缀的变量都可供类中的所有方法使用,像这样可以通过实例访问的变量称为属性;
有关父子类:
super()
是一个特殊函数,将父类和子类关联起来;super()
方法需要传递两个实参:子类名和self,并且父类定义的括号内指定字段object;在Python 2.7中创建类时,需要在括号类内包含单词object:class ClassName(object):
类实例(对象)的示例:
class Dog():
--snip--
my_dog = Dog('willie')
dog_name = my_dog.name #获取属性
dog_name = my_dog.get_age() #通过方法获取属性
my_dog.name = 'jucy' #直接修改属性
my_dog.set_age = 18 #通过方法修改属性
my_dog.sit() #调用方法
从dog.py模块里导入多个类:from dog import Dog, TinyDog
;
导入整个dog.py模块,然后用句点表示访问需要的类:import dog
;
collections模块里包含一个类OrderedDict
。该类的实例行为几乎与字典相同,区别在于其记录了键值对的顺序;
类的编码风格:
打开并读取一个文件,并将其内容显示到屏幕上:
with open('xxx.txt') as file_object:
contents = file_object.read()
print(contents)
open()
和关闭文件close()
可以同时使用,但当有bug时close()
执行不了会导致文件无法关闭。不写close()
将由Python确定是否关闭文件;with
关键字在不再需要访问文件后将其关闭;print(contens.rstrip())
;有关文件绝对路径:
file_path = '/home/.../xxx.txt'
;file_path = C:\...\xxx.txt
;逐行读取:
with open(filename) as file_object:
for line in file_object:
print(line)
print(line.rstrip())
;使用with
关键字时,open()
返回的对象只在with代码块内可用;
在处理文件相关时注意使用strip()
或rstrip()
去除字符串两边的空格;
Python将所有文本都解读成字符串;
open('xxx.txt', 'w')
:以写入方式打开文件;
r
读取、a
附加、r+
读写;a
附加:将内容附加到文件末尾,而不是覆盖文件原来的内容;w
写入模式打开文件需要小心,如果指定文件名已存在,Python将在返回对象前清空文件;使用 try-except 处理异常:
try:
print(5/0)
except ZeroDivisionError:
print('捕获到ZeroDivisionError异常')
else:
print('未捕获异常')
finally:
print('无论是否有异常都会执行')
except
的缩进块里添加关键字pass跳过错误捕获;else
和finally
部分的代码块可省;使用Python标准库中的模块unittest
进行测试;
一个简单的测试示例:
import unittest
from model_name import function_name
class TestCase(unittest.TestCase):
"""测试函数function_name"""def setUp(self):
"""构建前置条件"""
def test_function(self):
run_result = function_name(parameter)
self.assertEqual(run_result, correct_result)
unittest.main()
unittest
和被测试方法function_name
;TestCase
类,其包含各种具体的单元测试方法。该类继承unittest.TestCase
类;setUp()
方法的作用是创建前置条件;test_function
,方法名必须以test_
打头;assertEqual()
判断函数执行结果与预期结果的差别;unittest.main()
让Python运行这个文件中的测试;unittest里常用的6个断言方法请见《Python常用函数、方法示例总结(API)》;
每完成一个测试,Python都会打印一个字符:
.
;E
;F
;新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!
手机扫一扫
移动阅读更方便
你可能感兴趣的文章