python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。

Python55

Original: https://www.cnblogs.com/jnjnj/p/16226419.html
Author: python茜
Title: python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。



相关阅读1

Title: 5个方便好用的Python自动化脚本

相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率。

编程世界里有各种各样的自动化脚本,来完成不同的任务。

尤其Python非常适合编写自动化脚本,因为它语法简洁易懂,而且有丰富的第三方工具库。

这次我们使用Python来实现几个自动化场景,或许可以用到你的工作中。

很多人学习蟒蛇,不知道从何学起。

很多人学习寻找python,掌握了基本语法之后,不知道在哪里的案例上手。

很多已经可能知道案例的人,却不怎么去学习更多高深的知识。

这三类人,我给大家提供一个好的学习平台,免费获取视频教程,电子书,以及课程的源代码!

QQ群:101677771

欢迎加入,一起讨论学习

1、自动化阅读网页新闻

这个脚本能够实现从网页中抓取文本,然后自动化语音朗读,当你想听新闻的时候,这是个不错的选择。

代码分为两大部分,第一通过爬虫抓取网页文本呢,第二通过阅读工具来朗读文本。

需要的第三方库:

Beautiful Soup - 经典的HTML/XML文本解析器,用来提取爬下来的网页信息

requests - 好用到逆天的HTTP工具,用来向网页发送请求获取数据

Pyttsx3 - 将文本转换为语音,并控制速率、频率和语音

<span class="hljs-keyword">import pyttsx3
<span class="hljs-keyword">import requests
<span class="hljs-keyword">from bs4 <span class="hljs-keyword">import BeautifulSoup
engine = pyttsx3.init(<span class="hljs-string">'sapi5')
voices = engine.getProperty(<span class="hljs-string">'voices')
newVoiceRate = <span class="hljs-number">130                       </span></span></span></span></span></span></span>

2、自动生成素描草图

这个脚本可以把彩色图片转化为铅笔素描草图,对人像、景色都有很好的效果。

而且只需几行代码就可以一键生成,适合批量操作,非常的快捷。

需要的第三方库:

Opencv - 计算机视觉工具,可以实现多元化的图像视频处理,有Python接口

<span class="hljs-string">""" Photo Sketching Using Python """
  <span class="hljs-keyword">import cv2
  img = cv2.imread(<span class="hljs-string">"elon.jpg")

  </span></span></span>

3、自动发送多封邮件

这个脚本可以帮助我们批量定时发送邮件,邮件内容、附件也可以自定义调整,非常的实用。

相比较邮件客户端,Python脚本的优点在于可以智能、批量、高定制化地部署邮件服务。

需要的第三方库:

Email - 用于管理电子邮件消息

Smtlib - 向SMTP服务器发送电子邮件,它定义了一个 SMTP 客户端会话对象,该对象可将邮件发送到互联网上任何带有 SMTP 或 ESMTP 监听程序的计算机

Pandas - 用于数据分析清洗地工具

<span class="hljs-keyword">import smtplib
<span class="hljs-keyword">from email.message <span class="hljs-keyword">import EmailMessage
<span class="hljs-keyword">import pandas <span class="hljs-keyword">as pd

<span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">send_email<span class="hljs-params">(remail, rsubject, rcontent):
    email = EmailMessage()                          </span></span></span></span></span></span></span></span></span>

4、自动化数据探索

数据探索是数据科学项目的第一步,你需要了解数据的基本信息才能进一步分析更深的价值。

一般我们会用pandas、matplotlib等工具来探索数据,但需要自己编写大量代码,如果想提高效率,Dtale是个不错的选择。

Dtale特点是用一行代码生成自动化分析报告,它结合了Flask后端和React前端,为我们提供了一种查看和分析Pandas数据结构的简便方法。

我们可以在Jupyter上实用Dtale。

需要的第三方库:

Dtale - 自动生成分析报告

5、自动桌面提示

这个脚本会自动触发windows桌面通知,提示重要事项,比如说:您已工作两小时,该休息了

我们可以设定固定时间提示,比如隔10分钟、1小时等

用到的第三方库:

win10toast - 用于发送桌面通知的工具

from win10toast import ToastNotifier
import <span class="hljs-built_in">time
toaster = ToastNotifier()

header = <span class="hljs-built_in">input(<span class="hljs-string">"What You Want Me To Remember\n")
text = <span class="hljs-built_in">input(<span class="hljs-string">"Releated Message\n")
time_min=float(<span class="hljs-built_in">input(<span class="hljs-string">"In how many minutes?\n"))

time_min = time_min * <span class="hljs-number">60
<span class="hljs-built_in">print(<span class="hljs-string">"Setting up reminder..")
<span class="hljs-built_in">time.sleep(<span class="hljs-number">2)
<span class="hljs-built_in">print(<span class="hljs-string">"all set!")
<span class="hljs-built_in">time.sleep(time_min)
toaster.show_toast(f<span class="hljs-string">"{header}", f<span class="hljs-string">"{text}", duration=<span class="hljs-number">10, threaded=True)
<span class="hljs-keyword">while toaster.notification_active(): <span class="hljs-built_in">time.sleep(<span class="hljs-number">0.005)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

小结

Python能实现的自动化功能非常丰富,如果你可以"偷懒"的需求场景不妨试试。

Original: https://www.cnblogs.com/sn5200/p/15879878.html
Author: Python可乐的呀
Title: 5个方便好用的Python自动化脚本

相关阅读2

Title: Python自学教程5-字符串有哪些常用操作

任何编程语言,不管是Python、Java 还是 Golang, 字符串都是最重要的一种数据类型。 但是字符串的操作又很多,初学者经常毫无头绪,不知道从哪儿学起,也不知道哪些操作用得多,今天九柄就和你来扒一扒Python当中,怎么使用字符串比较合适。

字符串是什么

可以说,你在世界上看到的任意文字都将以字符串的形式展示,任何数据和内容也都可以用字符串表示,为了方便,我们就把字符串称为文字吧。

在 Python 中表示字符串有很多形式。在数据左右两边加一对引号,可以是单引号,双引号和三引号。引号是英文半角,全角会报错。

# 双引号  a = "jiubing"    # 单引号  a = 'jiubing'    # 三引号  a = '''jiubing'''  a = """jiubing"""    # 全角 Error  a = 'jiubing'

三引号既可以表示字符串,又可以表示注释。它们的区别在于是否使用变量存储,没有存储的字符串,无法复用,就是注释。

字符串如何获取某个字符

从字面上看,字符串是用字符串起来的,和羊肉串、牛肉串差不多,在吃羊肉串的时候,有的人习惯一口一串,从签子底部用嘴一划,所有的肉都被收进嘴里, 而我看到一些女生,吃羊肉串非常斯文, 她会先用筷子把一块肉挑到碗里再吃。

字符串也可以一个个字符的取,大多数情况下,都可以使用索引方式得到某个单一字符。索引的作用是取出一个字符,索引从0开始

man = "kang li"  print(man[1]) #a  print(man[0]) #k

索引可以是负数,表示倒数第几个,也就是从字符串的右边数到左边。索引为 -1 表示获取倒数第一个字符,索引为 -2 表示获取倒数第二个字符。为什么正序数的索引从 0 开始,倒序就不能从 0 开始呢?因为索引为 0 不能同时表示两个字符,会造成指令的冲突。

print(man[-1]) #i

超出索引范围报 IndexError 错误

print(man[8])

字符串截取

索引一次只能获取一个字符,切片可以一次获取多个。如果想获取字符串的某些子串,可以通过切片实现。切片的表示方法是:​ &#x200B;var[start: end]&#x200B;​。 start 表示开始位置的索引号,end 表示结束位置的索引号, 但是不包含 end。

girl = "Smile沫沫"  part_of_girl = girl[0:1]  print(part_of_girl)  # S

切片的索引号也可以是负数,但是在使用的时候要确保 end 是在 start 的右边,end - start > 0 。

girl = "Smile沫沫"  print(girl[0: -2])  # Smile  print(girl[-2: -4])  # 空字符串,取不到字符

切片的索引号超出范围是不会报错的,取到尽头为止。

girl = "Smile沫沫"  print(girl[0:100000000000])

切片的 start 和 end 都可以省略。

girl[1:]  girl[:-1]  girl[:]

切片可以加第三个参数, ​ &#x200B;girl[start:end:step]&#x200B;​, 其实使用切片时,默认的步长是为 1。

girl[0:3:2]

字符串逆序输出

步长为 -1,表示从后面往前面数,girl[::-1], 反转字符串。

girl[::-1]

获取字符串长度

len(girl)

字符串格式化

格式化相当于一个模板,模板中有些空位需要动态的填入数据。

python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。

image-20210903164914851

from_name = '张三'  title = '学费'  money = 500  to_name = '李四'    info = f"""  今天收到 {from_name}  交   来 {title}  人民币   {money} 元  收款人   {to_name}  """

更高级的字符串模板可以使用 template, 它主要防止用户输入对程序安全造成影响。 一般我们在web开发中的模板渲染就是基于这种技术。

字符串分割

split 通过某个分隔符分割字符串,分割后得到一个列表。 如果没有指定分隔符,则把整个字符串作为唯一的元素存放到列表中。

girls = 'Lucy-Monic-Jessy'  girl_list = girls.split('-')  print(girl_list) # ['Lucy', 'Monic', 'Jessy']    girl_list = girls.split()  print(girl_list) # ['Lucy-Monic-Jessy']

字符串拼接

join 方法是 split 的反向应用,它可以把一个列表通过特定的连接符组成一个字符串。

a = ['hello', 'world']  b = "".join(a)  print(b)

字符串查找

通常,可以使用 find 或者 index 来查找简单的字符:

a = "hello world"a.find("he")

但是如果涉及到复杂的匹配规则,一般会用正则表达式。

字符串匹配

正则表达式非常枯燥,在没有具体的实战场景前,建议不用花太多时间提前了解,不然时间花了,没几天又忘得一干二净。这里简单写一个匹配规则, 表示匹配一个数字。

import restring = "ayu7o99"re.search("\d", string)

字符串替换

replace 替换某个子串。但是原来的数据是不会发生变化的,而是把替换后的字符串用新的变量表示。

a = "Soul 小芳"  b = a.replace("Soul", "灵魂歌手")  print(b) # 灵魂歌手 小芳  print(a) # Soul 小芳

字符串删除某个字符

字符串是不可变的数据类型,并不能真的把某个字符删除,但是我们可以使用 replace 方法间接实现,把指定的字符串替换成空字符串。

a = "Soul 小芳" # 去掉 ou b = a.replace('ou', '')

自动化测试场景

1、使用 string 表示测试用例

username = 'jiubing1'  password = '123456'  age = 18    print("用户名", username)  print("密码", username)  print("年龄", username)

2、去掉 username 的空格

username = 'jiubing1'  first, last= username.split(' ')  username = ''.join([first, last])

3、格式化输出

user = f"""  -------------------------  用户名:{username}  密码:{password}  年龄:{age}  -------------------------  """

4、通过 input 打印出测试用例(模拟前端页面)

5、访问网址拼接

url = ''  full_url = f'{url}?username={username}&password={password}&age={age}'

6、通过网址获取所有参数(后面的内容)

url, params = full_url.split('?')  info = dict()  for param in params.split('&'):  key, value = param.split('=')  info.update({key:value})  print(info)

我是九柄,全网同号,下次再聊。

Original: https://blog.51cto.com/u_12188579/5616320
Author: 九柄聊测试
Title: Python自学教程5-字符串有哪些常用操作

相关阅读3

Title: tunm二进制协议在python上的实现

tunm是一种对标JSON的二进制协议, 支持JSON的所有类型的动态组合

支持的数据类型

基本支持的类型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "string", "raw", "array", "map"

为什么我们需要二进制协议

下图是文本格式JSON与tunm的对比

类型 可读 可编辑 编码速度 解码速度 数据大小 预定义 JSON ✓ ✓ 慢 慢 大 否 tunm x x 快 快 小 否 protobuf x x 快 快 小 是

在高性能的场景下, 或者需要流量传输比较敏感的地方, 通常会选择二进制来代替文本协议来做为通讯的, 如RPC, REST, 游戏等情况。
相对于google protobuf, 它需要比较完善的预定义过程, 就比如客户端版本1, 服务端版本2, 就有比较大的可能造成不兼容, 对需求经常变化的就会比较难与同步。
tunm相对于JSON, 若第一版是

{
    "name": "tunm", "version": 1
}

此时第二版需要加入用户的id, 就可以很方便的变成

{
    "name": "tunm", "version": 2, "id": 1
}

而对客户端1来说, 只是多一个id的字段, 不会有任何的破坏, 做到版本升级而无影响

协议的二进制格式

数据协议分为三部分(协议名称, 字符串索引区, 数据区(默认为数组))
如数据协议名为cmd_test_op, 数据为["tunm_proto", {"name": "tunm_proto", "tunm_proto": 1}]

协议的实现(小端对齐)

ByteBuffer具有组装字节流的功能, 比如写入字符串, 写入int, 还有里面存储字符串索引区

class ByteBuffer(object):
    def __init__(self):
        # 字节缓冲区
        self.buffer = bytearray([00]*1024)
        # 写入的位置索引号
        self.wpos = 0
        # 读出的位置索引号
        self.rpos = 0
        # 大小端格式
        self.endianness = "little"
        # 索引的数组及快速查询的字符串索引号
        self.str_arr = []
        self.str_map = {}
@enum.unique
class TP_DATA_TYPE(IntEnum):
    TYPE_NIL = 0,
    TYPE_BOOL = 1,
    TYPE_U8 = 2,
    TYPE_I8 = 3,
    TYPE_U16 = 4,
    TYPE_I16 = 5,
    TYPE_U32 = 6,
    TYPE_I32 = 7,
    TYPE_U64 = 8,
    TYPE_I64 = 9,
    TYPE_VARINT = 10,
    TYPE_FLOAT = 11,
    TYPE_DOUBLE = 12,
    TYPE_STR = 13,
    TYPE_STR_IDX = 14,
    TYPE_RAW = 15,
    TYPE_ARR = 16,
    TYPE_MAP = 17,
@staticmethod
def encode_varint(buffer: ByteBuffer, value):
    '''
    如果原数值是正数则将原数值变成value*2
    如果原数值是负数则将原数值变成-(value + 1) * 2 + 1
    相当于0->0, -1->1, 1->2,-2->3,2->4来做处理
    因为小数值是常用的, 所以保证小数值及负数的小数值尽可能的占少位
    '''
    if type(value) == bool:
        value = 1 if value else 0
    real = value * 2
    if value < 0:
        real = -(value + 1) * 2 + 1

    for _i in range(12):
        # 每个字节的最高位来表示有没有下一位, 若最高位为0, 则已完毕
        b = real & 0x7F
        real >>= 7
        if real > 0:
            buffer.write_u8(b | 0x80)
        else:
            buffer.write_u8(b)
            break
@staticmethod
def encode_str_idx(buffer: ByteBuffer, value):
    '''
    写入字符串索引值, 在数值区里的所有字符串默认会被写成索引值
    如果重复的字符串则会返回相同的索引值(varint)
    '''
    idx = buffer.add_str(value)
    TPPacker.encode_type(buffer, TP_DATA_TYPE.TYPE_STR_IDX)
    TPPacker.encode_varint(buffer, idx)
@staticmethod
def encode_field(buffer: ByteBuffer, value, pattern=None):
    '''
    先写入类型的值(u8), 则根据类型写入类型对应的的数据
    '''
    if not pattern:
        pattern = TPPacker.get_type_by_ref(value)
    if pattern == TP_DATA_TYPE.TYPE_NIL:
        return None
    elif pattern == TP_DATA_TYPE.TYPE_BOOL:
        TPPacker.encode_type(buffer, pattern)
        TPPacker.encode_bool(buffer, value)
    elif pattern >= TP_DATA_TYPE.TYPE_U8 and pattern = TP_DATA_TYPE.TYPE_U16 and pattern
@staticmethod
def encode_proto(buffer: ByteBuffer, name, infos):
    '''
    写入协议名称, 然后写入字符串索引区(即字符串数组), 然后再写入协议的详细数据
    '''
    sub_buffer = ByteBuffer()
    TPPacker.encode_field(sub_buffer, infos)

    TPPacker.encode_str_raw(buffer, name, TP_DATA_TYPE.TYPE_STR)
    TPPacker.encode_varint(buffer, len(sub_buffer.str_arr))
    for val in sub_buffer.str_arr:
        TPPacker.encode_str_raw(buffer, val, TP_DATA_TYPE.TYPE_STR)

    buffer.write_bytes(sub_buffer.all_bytes())

Original: https://www.cnblogs.com/luojiawaf/p/16411608.html
Author: 行稳致远up
Title: tunm二进制协议在python上的实现