深度优先

这个家伙好懒,除了文章什么都没留下

0%

转自:https://blog.csdn.net/Vincent_ceso/article/details/76462320

全局变量:所有函数之外定义的变量
局部变量:函数内部定义的变量 或者代码块里的变量

1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。
(即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#[demo1]
num = 100
def func():
newValue = 123 #一个全新的局部变量newValue
print(newValue)

func() #输出局部变量newValue 即新的局部变量

#[demo2]
num = 100
def func():
num= 123 #声明一个全新的局部变量num,虽然名字和外界的全部变量相同 但是是新的一个变量且是局部有效的。屏蔽了外面的同名的全部变量
print(num)

func() #输出局部变量num=123 即新的局部变量。

2.如果局部变量用到了一个变量。该变量是全局存在的,但是局部并没有声明这么一个变量。那么此时参与运算的是全局变量。但是这个参与运算是不能被赋值的,因为你赋值的时候按照python的语法那就是新生成一个局部变量,而且你在右侧使用的话。那就是会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#[demo1]
num = 100
def func():
x = num+200 #使用值做参数,那么其实是copy一份num全部变量的值
print(x)
print(id(num)) #id值

func() #输出300 即没有局部变量声明 那么使用就是全局变量
print(id(num)) #id值

#[demo2]

list = [100]
def func():
list.append(200) #直接使用变量,那么得到了全局变量 操作全局变量。
print(list)
print(id(list))

func() #输出[100,200]

3.如果你想在局部变量修改全局变量。
因为本身是不能的,你修改然后赋值的时候会出现矛盾。即你涉及到赋值var = xxx 修改的时候,那么会被语法解析会声明一个新的局部变量var。当然对象类型除外,你可以直接操作他的元素。

1
2
3
4
5
6
7
8
9
10
#[demo1]
num = 100
def func():
num= 123 #本来你的意图是赋值给全局变量Num,但是此处会被解析为声明一个全新的局部变量num
print(id(num))

func() #输出局部变量newValue 即新的局部变量
print(id(num))

那么怎么办?才能在局部变量赋值修改全局变量

关键字 global

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#[demo1]
Num = 100
def func():
global Num #声明这个Num是全局的哦。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
Num = 200 #此时此刻 凡是在函数内部Num的意思始终是指全局变量。不可能有个局部变量叫Num的。
print(Num )

func()
print(Num ) #输出200 说明修改的就是全局变量啊

#[demo2]
def func():
global Num #声明这个Num是全局的哦。而且恰恰是此时没有一个全局变量是Num。那么如果全局没这个Num那就新定义一个Num的全局变量。
Num = 200
print(Num )

func()
print(Num ) #输出200 说明新定义了一个全局变量Num

4.总结

  • 如果不是明显要局部变量和全局变量纠缠 能不纠缠就不纠缠。也就是定义变量名字的时候 要严格规范。按照开发规范来定义名字。全局大写或者加上“_”开头
  • 这是避免不必要问题的根本 消灭问题
  • 如果实在是场景需求 局部要操作修改赋值全局变量。那就使用global。

一、下载Python3.6.5

地址:https://www.python.org/downloads/windows/

似乎那个站点网络比较慢,下载时需要耐心等待!

二、安装Python3.6.5


三、测试环境变量配置

win+R 运行cmd
在黑框中输入: python
结果如下则安装环境配置正确,输入:exit(),可退出

继续输入:pip

结果如下则pip的环境配置正常

打印一句话试试:
继续输入:print(“hello Guanxing”)

到此为止python环境配置完毕!

四、WeChat聊天机器人
1.安装以管理员身份运行Cmd
2.输入pip install requsts 回车
3.输入pip install itchat
ps:如电脑上有多个版本的,用pip加版本号进行安装(如pip2.7)

4.编写程序
demo1:自动进行回复消息机器人

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -*- coding=utf-8 -*-
import requests
import itchat
import random

KEY = '6244875a21b14000b1f350f9145e41f1'

def get_response(msg):
print(msg)
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : KEY,
'info' : msg,
'userid' : 'wechat-robot',
}
try:
r = requests.post(apiUrl, data=data).json()
# print(r)
# print(r.get('text'))
return r.get('text')
except:
return

@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
defaultReply = 'I received: ' + msg['Text']
robots=['——Gx']
reply = get_response(msg['Text'])+random.choice(robots)
return reply or defaultReply

itchat.auto_login(enableCmdQR=True)
itchat.run()

demo2:指定时间给指定人发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from __future__ import unicode_literals
from threading import Timer
from wxpy import *
import requests

bot = Bot()

def get_news1():
# 获取金山词霸每日一句,英文和翻译
url = "http://open.iciba.com/dsapi/"
r = requests.get(url)
contents = r.json()['content']
translation = r.json()['translation']
print(contents)
return contents, translation

def send_news():
try:
my_friend = bot.friends().search(u'Summer°')[0]
# 你朋友的微信名称,不是备注,也不是微信帐号。
my_friend.send(get_news1()[0])
my_friend.send(get_news1()[1][5:])
my_friend.send(u"--来自爸爸的心灵鸡汤!")
#每86400秒(1天),发送1次,不用linux的定时任务是因为每次登陆都需要扫描二维码登陆,很麻烦的一件事,就让他一直挂着吧
t = Timer(86400, send_news)
t.start()
except:
my_friend = bot.friends().search('管星')[0]
# # 你的微信名称,不是微信帐号。
my_friend.send(u"今天消息发送失败了")

# # if __name__ == "__main__":
send_news()

将代码复制进记事本中,然后后缀改成.py即可!

后面有时间再补充VS Code中编辑器环境的配置

今天想弄个服务器监控的API,发现阿里云上面本来就提供api接口。

https://help.aliyun.com/document_detail/27208.html?spm=a2c4g.11186623.6.673.P6XLr2

https://error-center.aliyun.com/status/product/Cdn?spm=a2c69.11428812.0.0.47435e6a25YlIH

但是没有C#版的示例,很蛋疼,那就自己写呗,显示照着Java的示例改成C#的,发现那个签名好像还是计算错误了。

百度也没搜到有用的文章,最后Google.com搜索到了一个例子,完美解决了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace DomainRequest
{
public class RequestHelper
{
/// <summary>
/// 返回值的类型,支持JSON与XML。默认为XML
/// </summary>
public string Format { get; set; } = "JSON";

/// <summary>
/// API版本号,为日期形式:YYYY-MM-DD,本版本对应为2016-05-11
/// </summary>
public string Version { get; } = "2014-11-11";

/// <summary>
/// 阿里云颁发给用户的访问服务所用的密钥ID
/// </summary>
public string AccessKeyId { get; set; } = "****************";

/// <summary>
/// 签名结果串
/// </summary>
public string Signature { get; set; }

/// <summary>
/// 签名方式,目前支持HMAC-SHA1
/// </summary>
public string SignatureMethod { get; } = "HMAC-SHA1";

/// <summary>
/// 请求的时间戳。日期格式按照ISO8601标准表示,并需要使用UTC时间。格式为YYYY-MM-DDThh:mm:ssZ例如,2015-01-09T12:00:00Z(为UTC时间2015年1月9日12点0分0秒)
/// </summary>
public string Timestamp { get; set; } = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");

/// <summary>
/// 签名算法版本,目前版本是1.0
/// </summary>
public string SignatureVersion { get; } = "1.0";

/// <summary>
/// 唯一随机数,用于防止网络重放攻击。用户在不同请求间要使用不同的随机数值
/// </summary>
public string SignatureNonce { get; } = Guid.NewGuid().ToString();

/// <summary>
///
/// </summary>
private readonly HttpMethod _httpMethod;

/// <summary>
/// 阿里云颁发给用户的访问服务所用的密钥
/// </summary>
private string AccessKeySecret { get; set; } = "******************";

/// <summary>
///
/// </summary>
private readonly Dictionary<string, string> _parameters;

public RequestHelper(HttpMethod httpMethod, Dictionary<string, string> parameters)
{
_httpMethod = httpMethod;
_parameters = parameters;
}

private void BuildParameters()
{
_parameters.Add(nameof(Format), Format.ToUpper());
_parameters.Add(nameof(Version), Version);
_parameters.Add(nameof(AccessKeyId), AccessKeyId);
_parameters.Add(nameof(SignatureVersion), SignatureVersion);
_parameters.Add(nameof(SignatureMethod), SignatureMethod);
_parameters.Add(nameof(SignatureNonce), SignatureNonce);
_parameters.Add(nameof(Timestamp), Timestamp);
}

public void ComputeSignature()
{
BuildParameters();
var canonicalizedQueryString = string.Join("&",
_parameters.OrderBy(x => x.Key)
.Select(x => PercentEncode(x.Key) + "=" + PercentEncode(x.Value)));

var stringToSign = _httpMethod.ToString().ToUpper() + "&%2F&" + PercentEncode(canonicalizedQueryString);

var keyBytes = Encoding.UTF8.GetBytes(AccessKeySecret + "&");
var hmac = new HMACSHA1(keyBytes);
var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
Signature = Convert.ToBase64String(hashBytes);
_parameters.Add(nameof(Signature), Signature);
}

private string PercentEncode(string value)
{
return UpperCaseUrlEncode(value)
.Replace("+", "%20")
.Replace("*", "%2A")
.Replace("%7E", "~");
}

private static string UpperCaseUrlEncode(string s)
{
char[] temp = HttpUtility.UrlEncode(s).ToCharArray();
for (int i = 0; i < temp.Length - 2; i++)
{
if (temp[i] == '%')
{
temp[i + 1] = char.ToUpper(temp[i + 1]);
temp[i + 2] = char.ToUpper(temp[i + 2]);
}
}
return new string(temp);
}

public string GetUrl(string url)
{
ComputeSignature();
return "http://"+ url + "/?" +
string.Join("&", _parameters.Select(x => x.Key + "=" + HttpUtility.UrlEncode(x.Value)));
}
}
}

调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private static async void CheckDomain(string domain= "cdn.aliyuncs.com")
{
var parameters = new Dictionary<string, string>()
{
{"Action", "DescribeDomainSrcFlowData"},
};
var request = new RequestHelper(HttpMethod.Get, parameters);
var url = request.GetUrl(domain);
string result;
using (var httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(url);
// response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
//剩下的该干嘛干嘛
}
}

结果: