Python入门1之基本语法
专刊目录
创作计划
之所以把创作计划放在第一位,就是要先立个flag,凡事预则立,不预则废。接下来的3年时间里,我会每周都输出技术文章,作为一个新的五年计划的起点。接下来的系列主要是帮助各位小白入门,计划编程语言主要写3个系列,分别是Python,go,rust。数据库分别是MySQL,MongoDB,Redis这3个。然后就是高阶的如云计算、大数据、人工智能等技术与能力的输出专栏。最后是一些哲思和禅学思考。
专刊序言
过去几年里,我先后在国企、民营世界500强金融企业、大数据研究院、创业企业等做技术研发工作,有幸在工作之余,也利用工作之便走进高校完成了部分必修课的教学工作,先后在某本科高校教授过2个学期的Python程序设计、数据挖掘与分析等专业课程,在技术增长的同时,也输出了一些优秀的内容,如在百度AI社区写的一篇预测新冠疫情的notebook,已经有2万余次的浏览量。同时出版了几本自己参与编写的书籍等等。在接下来的5年时间里,我在创业工司奋斗的同时将会把自己遇到的一些技术问题,解决思路及管理上面的一些感悟及对于技术,对于生命,对于哲学等的思考分享在专栏中,希望自己将来可以从这些文章中吸取养分,如果各位看到文章的有缘人能感觉到有所成长,那对我来说就是无上荣耀,感恩!
Python序
和Python的结缘来自9年前的一个下午,我坐在学校图书馆的时候,看到书架上摆着一本与Python有关的书,就不经意间拿着它看了起来,虽然当时写Java也才2年,但是突然看到Python的语法,顿时感觉Java显得有些臃肿,记得那个时间段看Java编程思想,这本书的作者就写了他平时大部分用Java和Python,于是我就继续去寻找与Python有关的书,可是那个时候Python的书非常少,整个学校图书馆里面也没有基本,我就在网上跟着文档写起代码来,顺便还拉了我大学最好的朋友一起来学习Python,顺带提一句,我也拉他学习网络安全,他现在在奇安信工作,而我兜兜转转,也来了网络安全行业,来了大学时候很崇拜的一家公司的创业公司。所以为什么学Python,对不同的人来说目的不一样,我学它没有任何目的,纯粹就是因为好玩,而且简单。
Python语法入门
打印hello Word
print(‘hello word’)
这是学习每门编程语言都绕不过去的一个坎。
对比一下go语言打印的语法,让大家看看Python为什么简单
package main
import (
"fmt"
)
func main() {
fmt.Printf("hello world")
}
说到这里还得再说说打印变量
Python3.6之后有一个我最喜欢的f打印方法
a = 'hello world'
print(f'my first python {a}')
Python中的变量
每个编程语言都需要存放一些数据的容器,给这些容器打上标签,这个标签就是变量。
对于Python这样的动态语言来说,万物皆对象,不需要提前申明变量类型,便可以给变量赋值。
Python的变量有几种基本类型。
# 字符串
foo = 'bar'
# 整型,浮点型
foo_int,foo_float = 1,1.0
# 列表
foo_list = []
# 集合
foo_set = {'haha',2}
# 字典
foo_dict = {'haha':2}
当然还有更多种不同的类型,以及更底层的如Cpython等的实现以后再细说
对比一下js的赋值
// 赋值需要关键字var
var foo = 'bar';
对比一下go语言的赋值和类型
// var identifier type
var foob, fooc int = 1, 2;
// 布尔型
var fooa bool = true
// 数字类型
rune
byte
uint8
无符号 8 位整型 (0 到 255)
uint16
uint32
uint64
无符号 64 位整型 (0 到 18446744073709551615)
int8
有符号 8 位整型 (-128 到 127)
int16
int32
int64
有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
float32
float64
complex64
complex128
uint
int
uintptr
//还有字符串类型、指针类型、数组类型、结构体、Channel、Map类型、接口、切片类型等等
Python变量可以写的东西实在太多了,在下一篇文章聊聊,暂时就先熟悉一下,打个照面
Python的条件判断语句及循环
首先是Python的条件判断语句
# if...else语句
if xxx:
dosomething()
else:
doothers()
# if...elif...else语句
if xxx:
dosomething()
elif xxx1:
doxxx1()
elif xxx2:
doxxx2()
elif xxx3:
doxxx3()
else:
doothers()
# 还有即将在Python3.10以后加入的Switch-Case Statements
switch EXPR:
case EXPR:
SUITE
case EXPR:
SUITE
...
else:
SUITE
接着是Python的循环语句
# while语句
while xxx:
dosomething()
# while...else语句
while xxx:
dosomething()
else:
doothers()
# for语句
for <variable> in <sequence>:
<statements>
else:
<statements>
对比对比go语言的条件判断语句会发现go多了一堆大括号
Python中的函数
解下来举个最简单的例子
比如你要打印斐波那契数列,斐波那契数列在自然界中非常常见,生活中、工作中也是。在敏捷开发的过程中估计复杂度用的1,2,3,5,8,13等的扑克牌就是斐波那契数列。
# 普通方法打印斐波那契数列
def fibo(n):
a,b = 1,1
for i in range(n-1):
a,b = b,a+b
return a
# 递归打印斐波那契数列
def recur_fibo(n):
"""递归方法
输出斐波那契数列"""
if n <= 1:
return n
else:
return(recur_fibo(n-1) + recur_fibo(n-2))
可以看到,声明一个函数需要3元素,首先是def关键字,然后是函数名(参数),接着是函数体
再对比对比go语言的实现,所用行数比python多了一倍。
package main
import "fmt"
func fibo(num int) int{
if num<2{
return 1
}
return fibo(num-1) + fibo(num-2)
}
func main(){
for i := 0; i<10; i++{
nums := fibo(i)
fmt.Println(nums)
}
}
Python中的类
接下来就快步进入到面向对象的环节,首先来看一个类对象,Python类对象名要用驼峰命名法,其他命名采用下划线命名法,更多标准可以看pep8规范
# 创建一个动物类对象
class Animal(object):
def __init__(self,name)
self.name = name
def run(self):
print(f'{self.name} running')
def eat(self):
print(f'{self.name} eating')
def sleep(self):
print(f'{self.name} sleeping')
# 实例化一个动物类
>>> cat = Animal('cat')
# 调用类对象方法
>>> cat.eat()
cat eating
>>> dog = Animal('dog')
>>> dog.sleep()
dog sleeping
>>> type(dog)
<class '__main__.Animal'>
>>> type(Animal)
<class 'type'>
之前提过,对于Python来说,万物皆对象,所以Python的面向对象可以说是Python中最重要的概念,程序中除了通过class关键字定义的类是一个对象外,Python基本类型数据也是对象,一个字符数据是一个对象,一个浮点数数据也是一个对象,如:
>>> a = 1
>>> type(a)
<class 'int'>
>>> isinstance(a, int)
True
>>> type(int)
<class 'type'>
>>> b = "1"
>>> type(b)
<class 'str'>
>>> isinstance(b, str)
True
>>> type(str)
<class 'type'>
再推广开来,Python的类型也是一种对象,如:
>>> str
<class 'str'>
>>> float
<class 'float'>
>>> list
<class 'list'>
更深的就暂不细说了,以后会在专栏中写深入的文章来讨论
接下来看看go语言的类,做一个对比
在 go 语言中, type name struct{} 结构体 就相当于Python语言中的 class 类的概念
package main
import (
"fmt"
"strconv"
)
type Animaler interface {
run()
sleep()
eat()
}
type Animal struct {
name string
}
// 实现 run() 方法
func (animal Animal) run() {
fmt.Println(animal.name + "runing")
}
// 实现 sleep() 方法
func (animal Animal) sleep() {
fmt.Println(animal.name + "sleeping")
}
// 实现 eat() 方法
func (animal Animal) eat() {
fmt.Println(animal.name + "eating")
}
type Cat struct {
Animal
}
type Dog struct {
Animal
}
func main() {
dog := Dog{Animal:Animal{name:"大黄"}}
dog.run()
cat := Cat{Animal:Animal{name:"(>^ω^<)喵"}}
cat.sleep()
}
学习Python的一点小小的建议
- 首先,一定要把Python的基础打牢,掌握整个语言的基本语法
- 大学生要按照自己的兴趣爱好来熟悉不同的各个领域的Python库,不要自我局限于某几个库
- 尝试参加一些开源的Python项目,通过开源项目增加自己的工程能力
如何跟着一个开源项目学习用Python做软件
比如想要介入爬虫领域,几个工具库是避不开要学习的
我这里就简单以requests,selenium python端的代码为例来聊一聊,之后也计划开几个python、go的经典库的源码带读系列。
这里先从低版本的代码开始
git clone https://github.com/psf/requests/tree/v0.2.0
或者使用checkout
git clone https://github.com/psf/requests.git
git checkout v0.2.0
cd requests
在使用git拉代码后,我们可以使用branch看看分支、用checkout切换分支
git branch -a
git checkout -b newbranch
然后看看requests的基本使用
import requests
>>> conv_auth = requests.AuthObject('requeststest', 'requeststest')
>>> r = requests.get('https://convore.com/api/account/verify.json', auth=conv_auth)
>>> r.status_code
200
>>> r.headers['content-type']
'application/json'
>>> r.content
'{"username": "requeststest", "url": "/users/requeststest/", "id": "9408", "img": "censored-long-url"}'