Python之路,Day3 - Python基础3

本节内容

1. 函数基本语法及特性

2. 参数与局部变量

3. 返回值

嵌套函数

4.递归

5.匿名函数

6.函数式编程介绍

7.高阶函数

8.内置函数

温故知新

1. 集合

主要作用: 

  1. 去重
  2. 关系测试, 交集\差集\并集\反向(对称)差集
Highlighter">
>> a = {1,2,3,4}
>>> b ={3,4,5,6}
>>> a
{1,4}
>>> type(a)

>>> a.symmetric_difference(b)
{1,6}
>>> b.symmetric_difference(a)
{1,6}
>>> 
>>> 
>>> a.difference(b)
{1,2}
>>> a.union(b)
{1,6}
>>> a.issu
a.issubset(   a.issuperset(
>>> a.issubset(b)
False

2. 元组  

只读列表,只有count,index 2 个方法

作用:如果一些数据不想被人修改, 可以存成元组,比如身份证列表

3. 字典

key-value对

  1. 特性:
  2. 无顺序
  3. 去重
  4. 查询速度快,比列表快多了
  5. 比list占用内存多

为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法

dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。

上面依然没回答这样做查找一个数据为什么会比列表快,对不对? 呵呵,等我课上揭晓。

4. 字符编码

先说python2

  1. py2里认编码是ascii
  2. 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么?
  3. 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
  4. 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
  5. utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk

再说python3

  1. py3里文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
  2. 你声明的变量认是unicode编码,不是utf-8,因为认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u),此时你想转成gbk的话,直接your_str.encode("gbk")即可以
  3. 但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,我擦,这是怎么个情况,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,你能看出哪个字符对应哪段2进制么?什么?自己换算,得了吧,你连超过2位数的数字加减运算都费劲,还还是省省心吧。  
  4. 那你说,在py2里好像也有bytes呀,是的,不过py2里的bytes只是对str做了个别名(python2里的str就是bytes,py3里的str是unicode),没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 这么讲吧, 无论是2还是三, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字

编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换,不过生活正在变美好,期待一个不需要转码的世界。

最后,编码is a piece of fucking shit,noboby likes it.

1.函数基本语法及特性

背景提要

现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码

Highlighter">
 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接
if 硬盘使用空间 > 90%:
    #<a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>提醒
    连接邮箱服务器
    <a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>
    <a href="https://www.jb51.cc/tag/guanbi/" target="_blank" class="keywords">关闭</a>连接

if 内存占用 > 80%:
    #<a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>提醒
    连接邮箱服务器
    <a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>
    <a href="https://www.jb51.cc/tag/guanbi/" target="_blank" class="keywords">关闭</a>连接

上面的代码实现了功能,但即使是邻居老王也看出了端倪,老王亲切的摸了下你家儿子的脸蛋,说,你这个重复代码太多了,每次报警都要重写一段发邮件代码,太low了,这样干存在2个问题:

  1. 代码重复过多,一个劲的copy and paste不符合高端程序员的气质
  2. 如果日后需要修改邮件的这段代码,比如加入群发功能,那你就需要在所有用到这段代码的地方都修改一遍

你觉得老王说的对,你也不想写重复代码,但又不知道怎么搞,老王好像看出了你的心思,此时他抱起你儿子,笑着说,其实很简单,只需要把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行了,如下

Highlighter">
while True:

if cpu利用率 > 90%:
    <a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>('<a href="https://www.jb51.cc/tag/cpu/" target="_blank" class="keywords">cpu</a>报警')

if 硬盘使用空间 > 90%:
    <a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>('硬盘报警')

if 内存占用 > 80%:
    <a href="https://www.jb51.cc/tag/fasongyoujian/" target="_blank" class="keywords">发送邮件</a>('内存报警')

你看着老王写的代码,气势恢宏、磅礴大气,代码里透露着一股内敛的傲气,心想,老王这个人真是不一般,突然对他的背景更感兴趣了,问老王,这些花式玩法你都是怎么知道的? 老王亲了一口你儿子,捋了捋不存在的胡子,淡淡的讲,“老夫,年少时,师从京西沙河淫魔银角大王 ”, 你一听“银角大王”这几个字,不由的娇躯一震,心想,真nb,怪不得代码写的这么6,这“银角大王”当年在江湖上可是数得着的响当当的名字,只可惜后期纵欲过度,卒于公元2016年, 真是可惜了,只留下其哥哥孤守当年兄弟俩一起打下来的江山。 此时你看着的老王离开的身影,感觉你儿子跟他越来越像了。。。

 

函数是什么?

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用函数名即可

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法定义

Highlighter">
rush:python;gutter:true;">def sayhi():#函数名
    print("Hello,I'm nobody!")

sayhi() #调用函数

可以带参数

Highlighter">
rush:python;gutter:true;">#下面这段代码
a,b = 5,8
c = a**b
print(c)

改成用函数

def calc(x,y):
res = x**y
return res #返回函数执行结果

c = calc(a,b) #结果赋值给c变量
print(c)

2.函数参数与局部变量  

变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

认参数

看下面代码

Highlighter">
rush:python;gutter:true;">def stu_register(name,age,country,course):
    print("----注册学生信息------")
    print("姓名:",name)
    print("age:",age)
    print("国籍:",country)
    print("课程:",course)

stu_register("王山炮",22,"CN","python_devops")
stu_register("张叫春",21,"linux")
stu_register("刘老根",25,"linux")

发现 country 这个参数 基本都 是"CN",就像我们在网站上注册用户,像国籍这种信息,你不填写,认就会是 中国, 这就是通过认参数实现的,把country变成认参数非常简单

Highlighter">
rush:python;gutter:true;">def stu_register(name,course,country="CN"):

这样,这个参数在调用时不指定,那认就是CN,指定了的话,就用你指定的值。

另外,你可能注意到了,在把country变成认参数后,我同时把它的位置移到了最后面,为什么呢?  

关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。

Highlighter">
rush:python;gutter:true;">stu_register(age=22,name='alex',course="python",)

  

非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数

Highlighter">
rush:python;gutter:true;">def stu_register(name,*args): # *args 会把多传入的参数变成一个元组形式
    print(name,args)

stu_register("Alex",22)

输出

Alex 22 () #后面这个()就是args,只是因为没传值,所以为空

stu_register("Jack",32,"Python")

输出

Jack 32 ('CN','Python')

还可以有一个**kwargs

Highlighter">
rush:python;gutter:true;">def stu_register(name,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
    print(name,args,kwargs)

stu_register("Alex",22)

输出

Alex 22 () {}#后面这个{}就是kwargs,"Python",sex="Male",province="ShanDong")

输出

Jack 32 ('CN','Python') {'province': 'ShanDong','sex': 'Male'}

局部变量  

Highlighter">
rush:python;gutter:true;">name = "Alex Li"

def change_name(name):
print("before change:",name)
name = "金角大王,一个有Tesla的男人"
print("after change",name)

change_name(name)

print("在外面看看name改了么?",name)

输出

Highlighter">
rush:python;gutter:true;">before change: Alex Li
after change 金角大王,一个有Tesla的男人
在外面看看name改了么? Alex Li

全局与局部变量

ara">在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量
ara">全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
ara">当全局变量与局部变量同名时:
ara">在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

3.返回值  

要想获取函数的执行结果,就可以用return语句把结果返回

注意:

  1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
  2. 如果未在函数中指定return,那这个函数的返回值为None 

  

强行插入知识点: 嵌套函数  

看上面的标题的意思是,函数还能套函数?of course

Highlighter">
rush:python;gutter:true;">name = "Alex"

def change_name():
name = "Alex2"

def change_name2():
    name = "Alex3"
    print("第3层打印",name)

change_name2() #<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>内层<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>
print("第2层打印",name)

change_name()
print("最外层打印",name)

此时,在最外层调用change_name2()会出现什么效果

没错, 出错了, 为什么呢?

嵌套函数用法会了,但它有什么用呢?下节课揭晓。。。

  

4. 递归

函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

Highlighter">
rush:python;gutter:true;">def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2))

calc(10)

输出
10
5
2
1

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用次数过多,会导致栈溢出)

堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 

递归函数实际应用案例,二分查找

Highlighter">
def binary_search(dataset,find_num):
print(dataset)

if len(dataset) >1:
    mid = int(len(dataset)/2)
    if dataset[mid] == find_num:  #find it
        print("找到数字",dataset[mid])
    elif dataset[mid] > find_num :# 找的数在mid左面
        print("\033[31;1m找的数在mid[<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>]左面\033[0m" % dataset[mid])
        return binary_search(dataset[0:mid],find_num)
    else:# 找的数在mid右面
        print("\033[32;1m找的数在mid[<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>]右面\033[0m" % dataset[mid])
        return binary_search(dataset[mid+1:],find_num)
else:
    if dataset[0] == find_num:  #find it
        print("找到数字啦",dataset[0])
    else:
        print("没的分了,要找的数字[<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>]不在列表里" % find_num)

binary_search(data,66)

  

5. 匿名函数 

匿名函数就是不需要显式的指定函数

Highlighter">
rush:python;gutter:true;">#这段代码
def calc(n):
    return n**n
print(calc(10))

换成匿名函数

calc = lambda n:n**n
print(calc(10))

你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下

Highlighter">
rush:python;gutter:true;">res = map(lambda x:x**2,[1,8])
for i in res:
    print(i)

输出

125491664

6.函数式编程介绍  

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用调用几次,值都是不变的。

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

一、定义

简单说,"函数式编程"是一种aradigm" target="_blank">"编程范式"(programming paradigm),也就是如何编写程序的方法论。

主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:

  (1 + 2) * 3 - 4

传统的过程式编程,可能这样写:

  var a = 1 + 2;

  var b = a * 3;

  var c = b - 4;

函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

  var result = subtract(multiply(add(1,2),3),4);

这段代码再演进以下,可以变成这样

add(1,2).multiply(3).subtract(4)

这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:

merge([1,2],[3,4]).sort().search("2")

因此,函数式编程的代码更容易理解。

要想学好函数式编程,不要玩py,玩Erlang,Haskell,好了,我只会这么多了。。。

7.高阶函数

变量可以指向函数函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

Highlighter">
rush:python;gutter:true;">def add(x,y,f):
    return f(x) + f(y)

res = add(3,-6,abs)
print(res)

8. 内置参数  

内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 

display: none;" onclick="cnblogs_code_hide('1e06cf6c-27b4-4f51-a3b8-ea37f22470b7',event)" src="https://www.jb51.cc/res/2019/02-10/23/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
f = open(函数递归.py=compile(f.read(),,<span style="color: #008000;">#<span style="color: #008000;">print
msg = <span style="color: #800000;">"
<span style="color: #800000;">又回到最初的起点
<span style="color: #800000;">"
<span style="color: #000000;">
f
= open(<span style="color: #800000;">"
<span style="color: #800000;">tofile
<span style="color: #800000;">"
,<span style="color: #800000;">"
<span style="color: #800000;">w
<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print(msg,<span style="color: #800000;">"<span style="color: #800000;">记忆中你青涩的脸<span style="color: #800000;">",sep=<span style="color: #800000;">"<span style="color: #800000;">|<span style="color: #800000;">",end=<span style="color: #800000;">"",file=<span style="color: #000000;">f)

<span style="color: #008000;">#<span style="color: #008000;"> #slice<span style="color: #008000;">

<span style="color: #008000;"> a = range(20)<span style="color: #008000;">

<span style="color: #008000;"> pattern = slice(3,8,2)<span style="color: #008000;">

<span style="color: #008000;"> for i in a[pattern]: #等于a[3:8:2]<span style="color: #008000;">

<span style="color: #008000;"> print(i)<span style="color: #008000;">

<span style="color: #008000;">#<span style="color: #008000;">memoryview<span style="color: #008000;">

<span style="color: #008000;">usage:<span style="color: #008000;">

<span style="color: #008000;">>>> memoryview(b'abcd')<span style="color: #008000;">

<span style="color: #008000;"><memory at 0x104069648><span style="color: #008000;">

<span style="color: #008000;">在进行切片并赋值数据时,不需要重新copy原列表数据,可以直接映射原数据内存,

<span style="color: #0000ff;">import<span style="color: #000000;"> time
<span style="color: #0000ff;">for n <span style="color: #0000ff;">in (100000,200000,300000,400000<span style="color: #000000;">):
data = b<span style="color: #800000;">'<span style="color: #800000;">x<span style="color: #800000;">'*<span style="color: #000000;">n
start =<span style="color: #000000;"> time.time()
b =<span style="color: #000000;"> data
<span style="color: #0000ff;">while<span style="color: #000000;"> b:
b = b[1<span style="color: #000000;">:]
<span style="color: #0000ff;">print(<span style="color: #800000;">'<span style="color: #800000;">bytes<span style="color: #800000;">',n,time.time()-<span style="color: #000000;">start)

<span style="color: #0000ff;">for n <span style="color: #0000ff;">in (100000,400000<span style="color: #000000;">):
data = b<span style="color: #800000;">'<span style="color: #800000;">x<span style="color: #800000;">'*<span style="color: #000000;">n
start =<span style="color: #000000;"> time.time()
b =<span style="color: #000000;"> memoryview(data)
<span style="color: #0000ff;">while<span style="color: #000000;"> b:
b = b[1<span style="color: #000000;">:]
<span style="color: #0000ff;">print(<span style="color: #800000;">'<span style="color: #800000;">memoryview<span style="color: #800000;">',time.time()-start)

方法用法提醒

  

  

本节作业

有以下员工信息表

 

当然此表你在文件存储时可以这样表示

Highlighter">
rush:python;gutter:true;">1,Alex Li,13651054608,IT,2013-04-01

现需要对这个员工信息文件,实现增删改查操作

  1. 可进行模糊查询,语法至少支持下面3种:
    1.   select name,age from staff_table where age > 22
    2.   select  * from staff_table where dept = "IT"
    3.       select  * from staff_table where enroll_date like "2013"
    4. 查到的信息,打印后,最后面还要显示查到的条数 
  2. 可创建新员工纪录,以phone做唯一键,staff_id需自增
  3. 删除指定员工信息纪录,输入员工id,即可删除
  4. 修改员工信息,语法如下:
    1.   UPDATE staff_table SET dept="Market" WHERE where dept = "IT"

 注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实