为什么学习python?

1)之前一直有学习python的想法,在Java和Python之间,我之前的选择是Java,因为时间和精力有限,就选择了一个方向,深入下去。

2)空闲时间实在太多,处理完日常工作,又分出考各种证书的学习时间,还有富裕。干点啥呢,学习python吧。

3)总是听说python在表格处理/自动化运维/网络爬虫/人工智能等领域有对应的实践,那就学习一下呗,所谓技多不压身。

话不多说,开始学习!

第一部分-类型和表达式部分

【注意】:2.7版本之后,print "xxx" 要换成 print("xxx")

Hello,world!

>>> print("Hello world!")
Hello world!

两个数相乘

>>> print(3*6)
18

变量定义

smart_city="网研院"
print(smart_city)
smart_city="智研院"
print(smart_city)

【注意】这里的smart_city = "xxxx"不叫变量赋值,而叫变量绑定,python维护了一个符号表(变量名)以及符合对应的值,这个对应关系就叫做绑定,一个符号可以绑定任意类型的值。

两数相乘

x = input()
y = input()

print(int(x) * int(y))

【注意】input()函数输入的是字符串格式,所以自己在键盘输入的整数其实并不是正整数,而是字符串形式。所以在执行语句x*y会报错。因为x和y都是字符串形式,不可以相乘。

所以需要进行强制转换。

函数定义

#函数定义
def bi_smart():
    print("联通智能城市研究院")

bi_smart()

强制类型转换

#强制类型转换
print(1+int("1"))
print(str(1)+"1")

输出:

2
11

【注意】:int对字符串进行转换时,要求字符类型是整数int('1'),或者输入的是纯数字 int(1.1),而不能是int('1.1')这种类型,否则就会报错如下:

ValueError: invalid literal for int() with base 10: '1.1'

字符串

1)python三引号

#字符串:Python 中三引号可以将复杂的字符串进行赋值,三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
print('''python
学习
路线''')

输出

python
学习
路线

2)原始字符串

#原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。
print(r'python 学习\c\d\t')

输出

python 学习\c\d\t

 3)带转义字符的字符串

#带转义字符的字符串
print('python 学习\n路线')

输出

python 学习
路线

序列

1)列表

列表特点:

#列表:列表的数据项不需要具有相同的类型,并且列表是可变的
L1=['abc',1,True,"python"]

增删改查基本操作:

#访问列表中的值,索引访问
L=['abc',1,True,"python"]
print(L[1])
print(L[1:])
print(L[1:3])
#更新列表元素
L.append("Tom")
#删除列表元素
del L[1]
#分片删除
del L[3:]
#分片赋值
L[1:3]=['1','abc',1992]

脚本操作符

#脚本操作符:列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表

#操作符"+",组合
L1=[1,2,3]
L2=[4,5,6]
L3=L1+L2
print("列表之间+组合:")
print(L3)
#列表长度函数,长度
print("列表L1的长度:")
print(len(L1))
#操作符"*",重复
L4=["smart_city"]
print("重复:")
print(L4*4)
#元素是否在列表中
print("判断元素7是否在列表L1中")
print(7 in L1)
#迭代
print("列表L1迭代输出")
for x in L1:print(x)

输出

列表之间+组合:
[1, 2, 3, 4, 5, 6]
列表L1的长度:
3
重复:
['smart_city', 'smart_city', 'smart_city', 'smart_city']
判断元素7是否在列表L1中
False
列表L1迭代输出
1
2
3

python列表函数&方法

#python列表函数&方法

#比较两个列表的元素:python2中的函数cmp,但是在python3中已经不存在该函数,需要引入operator模块
import operator
L1=[1,2,3]
L2=[4,5,6]
#判断列表是否相等
print(operator.eq(L1,L2))
#判断列表的大小关系:lt(小于)/le(小于等于)/gt(大于)/ge(大于等于)
print(operator.__lt__(L1,L2))

#max函数:返回列表中最大的元素
print(max(L1))

#min函数:返回列表中最小的元素
print(min(L1))

2)元组

特点:不可变

#元组(tuple):Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。
t1=(1,2,3)
print(t1)
#逗号引发的python编译问题,Python具备返回多个值的特性,所以每当我们在一个函数或者方法中返回多个值时,这些值就会被打包成一个元组进行返回

Tuple=[1,2,3],
print(Tuple)
输出:因为一个逗号的存在,列表变成了元组返回
([1, 2, 3],)

3)字符串:python字符串格式化

#python字符串格式化,Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,
#但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

print("学习%s的过程,%s下去" % ("python","坚持"))

输出:

学习python的过程,坚持下去

4)字典:针对字典dict的操作原理同list/tuple基本一致

""" Python字段dict:字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
 """
d={'a':1,'b':2,'c':3}
#打印字典中所有元素
print(d)
#打印字典中对应键的值
print(d['a'])
#根据键删除字典中的元素
del d['a']
print(d)

Python序列解包

#python序列解包,实用的python语法糖
>>> x,y,z=1,2,3
>>> print(x)
1
#*获取的值默认是list
>>> a,b,*c=1,2,3,4
>>> print(c)
[3, 4]
#如果左值比右值要多,那么带*的变量默认为空
>>> A,B,C,*D=1,2,3
>>> print(D)
[]

bool值&bool运算

#bool运算
print(1<2 and 10>11)

#bool值:bool()函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
#bool是int 的子类。
#1.当对数字使用bool函数时,0返回假(False),任何其他值都返回真。
print(bool(0))
print(bool(1))
#2.当对字符串使用bool函数时,对于没有值的字符串(也就是None或者空字符串)返回False,否则返回True。
print(bool())
print(bool(None))
print(bool("abc"))
#3.bool函数对于空的列表,字典和元祖返回False,否则返回True。
print(bool([]))
a=[]
a.append("1")
print(bool(a))
#4.用bool函数来判断一个值是否已经被设置。
x = input('Please enter a number :')
print(bool(x.strip()))

python语句块

#语句块。:开始语法块,缩进的所有内容都是一个语法块
if(10>1):
    print("YES")
else:
    print("NO")

python三元表达式

#python中的三元表达式,python中没有其他语言中的三元表达式,不过有类似的实现方法
a=1
b=2
c=""
c="YES" if a<b else "NO"
print(c)

相等比较

#运算符"=="和"is"的差别:==比较的是内容,is比较的是引用。
a=[1,2,3]
b=a
c=[1,2,3]
print(a==b)
print(a==c)
print(a is b)
print(a is c)

输出

True
True
True
False

循环

#循环:for循环类似C#的foreach,注意for后面是没有括号的,python真是能简洁就尽量简洁。
for x in range(1,3):
    print(x)

for key in {"a":1,"b":2}:
    print(key)

for key, value in {"a":1,"b":2}.items():
    print(key,value)

for x,y,z in [[1,2,3],['a','b','c']]:
    print(x,y,z)

输出

1
2
a
b
a 1
b 2
1 2 3
a b c

 pass、exec和eval

#pass、exec和eval


""" exec 执行储存在字符串或文件中的 Python 语句。

语法:exec(object[, globals[, locals]])

参数:
object:表示需要被指定的Python代码
globals:表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
locals:表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
"""

exec('print(x)',{"x":"abc"})

#eval:可以把字符串里的字符转换为可执行代码,但只支持一行字符。可以返回执行后得到的值

print(eval('1+2+3+4+5'))

#Python pass 是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。
#如果定义一个空函数程序会报错,当你没有想好函数的内容是可以用 pass 填充,使程序可以正常运行。

def passFuc():
    pass

for x in range(1,10):
    if(x==5):
        print(x)
    else:
        passFuc

输出:

abc
15
5

 

第二部分-函数

形参和实参之间是按值传递的,当然有些类型的值是引用(对象、列表和字典等)

#函数部分

#基本函数定义:
def func():
    print("Hello,python")

func()

#带单一返回值的函数

def funcWithSingleReturn():
    return "funcWithDataReturn"

print(funcWithSingleReturn())

#带多个返回值的函数
def funcWithMultiReturn():
    return "funcWithDataMultiReturn1,funcWithDataMultiReturn2"
print(funcWithMultiReturn())

#包含两个参数的函数
def funcWithTwoParams(x,y):
    print(x,y)
funcWithTwoParams(1,2)

#形参和实参数量不一致的函数
def funcUncatchNumParams(x,y,*rest):
    print(x,y,*rest)
funcUncatchNumParams(1,2,3,4,5)

#命名参数函数

def funcWithName(x,y,z):
    print(x,y,z)
funcWithName(x=1,y=2,z=3)

#参数中包含默认值的函数
def funcWithDefaultParam(x,y,z=3):
    print(x,y,z)
funcWithDefaultParam(5,4)

#收集命名参数
def func_with_collection_rest_naned_parameters(*args, **named_agrs):
    print(args)
    print(named_agrs)

func_with_collection_rest_naned_parameters(1, 2, 3, x = 4, y = 5, z = 6)

#集合扁平化
func_with_collection_rest_naned_parameters([1, 2, 3], {"x": 4, "y": 4, "z": 6}) #这会导致args[0]指向第一个实参,args[1]指向第二个实参。
func_with_collection_rest_naned_parameters(*[1, 2, 3], **{"x": 4, "y": 4, "z": 6}) #这里的执行相当于func_with_collection_rest_naned_parameters(1, 2, 3, x = 4, y = 5, z = 6)。

 


 

第三部分-作用域

#函数作用域

#局部变量,只有函数执行才会开启一个作用域,输出:1

if(2>1):
     x=1
print(x)

#使用vars()函数可以访问当前作用域的变量,输出:2
y=2
print(vars()['y'])

#局部变量会覆盖隐藏全局变量
#使用global定义变量,可以访问全局变量,输出分别是1和2,因为global修饰了a,此时print输出的全局变量1,但是函数内部又进行了更改,所以在外部输出的是2
#这样也就解决了,在函数内部想使用全局变量,使用之后又再赋值之后外部进行输出或者另作他用

a=1
def funcWithGlobalVar():
    global a
    print(a)
    a=2

funcWithGlobalVar()
print(a)
    
#locals() 函数会以字典类型返回当前位置的全部局部变量。输出:{'args': 2, 'x': 1}

def funcWithLocalVar(args):
    x=1
    print(locals())
funcWithLocalVar(2)


#每个函数定义时都会记住所在的作用域。
#函数执行的时候会开启一个新的作用域,函数内变量访问的规则是:先访问当前作用域,如果没有就访问函数定义时的作用域,递归直到全局作用域。


b=1
def funcWithNewArea():
    c=2
    print(b,c)

#如果在当前作用域出现了b=2赋值语句,则输出的是2,2;如果去掉下面这行赋值语句,会去函数定义的作用域去查找b的值,因为函数定义时也没有赋值,此时会递归到全局作用域,输出的时1,2
b=2
funcWithNewArea()


#变量访问的始终是当前作用域

x=1
def funcWithCurrentVar():
    x,y=2,3
    print(x,y)

funcWithCurrentVar()#输出(2,3)

print(x)#输出1


#Python闭包:关于闭包的解释,来自:https://www.cnblogs.com/s-1314-521/p/9763376.html

#a和b都是外函数的临时变量
def outer(a):
    b=10
    def inner():
        print("python闭包:",a+b)
    #外函数返回内函数的引用
    return inner

demo=outer(5)
#demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
demo()



##函数作为对象
def func(fn, arg):
    fn(arg)

func(print, "hello")
func(lambda arg : print(arg), "hi")

 


 

 

第四部分-模块

【定义】:在Python中,一个.py文件就称之为一个模块(Module)

【使用模块的好处】:

 1) 大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

 2) 使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突

#a.py
print (__name__)
def say_a():
    print("a")

在另一个文件中引入模块a:

#b.py
#这种引入方式,破坏了对命名空间的管理
from a import *

def say_b():
    a.say_a()
    print("b")


print (__name__)
#此处,模块a是被import之后调用,所以__name__属性的值是文件名a
print(a.__name__)

最后,在demo.py中引入模块b,调用a中的函数

#demo.py
import b

print(__name__)


print("分割线------")
b.say_b()
b.say_a()
b.a.say_a()

【注意】:"_name"属性,如果当前文件主动运行,该值为"__main__",如果是被其他模块引入,比如在b.py文件中那样,print("a.__name__"),输出的是a模块的名字"a";

 


 

 

第五部分-异常管理

 

#异常

#自定义异常:必须继承于BaseException

class SmartException(BaseException):
    print("smart_exception")

#引发和捕获异常

try:
    raise SmartException

except:
    print("捕获SmartException异常")

#捕获多种异常
try:
    raise SmartException
except(SmartException,NameError):
    print("捕获多种异常")

#访问异常实例

try:
    raise SmartException("访问异常实例")
except(SmartException,NameError) as e:
    print(e)

#按类型捕获异常
try:
    raise SmartException
except SmartException:
    print("SmartException")
except TypeError:
    print("typeError")

#try-except-else-finally

try:
    pass
except :
    print("try-except-else-finally")
else:
    print("else结构")
finally:
    print("总会执行finally")

 


 

 

第六部分-面向对象编程

这部分内容整合自:面向对象编程 - 廖雪峰的官方网站 (liaoxuefeng.com)

python闭包和装饰器,以及@语法糖

#Python闭包和@语法糖,python装饰器
def log(func):
    def wrapper(*param):
        print("开始调用函数")
        func(param)
        print("结束调用")
    return wrapper


@log
def eat(name):
    print("%s在哭" % name)

eat("小孩子")

函数式编程:

#函数式编程
g=lambda x:2*x+1

print(g(5))


print(list(filter(lambda x: x%2,range(1,10))))

print(list(map(lambda x: 2*x,range(10))))