linux中playbook的控制语句

news2025/2/6 0:51:37
本章主要介绍 playbook中的控制语句。
  • 使用 when 判断语句
  • block-rescue判断
  • 循环语句
一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个
条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 block-rescue两
种判断语句。
32.1 判断语句when
when作为一个判断语句,出现在某个 task下,格式如下。
1 tasks:
2 ‐ name: aa
3 模块1
4 when: 条件1
如果条件1成立,则执行模块1,否则不执行。
注意
在when中引用变量时是不用加{{}}的。

本章实验都在/home/duan/demo3下操作,先把 demo3目录创建出来并把ansible.cfg
和 hosts拷贝进去,命令如下。
[root@pp ~]# mkdir demo3
[root@pp ~]# cp ansible.cfg hosts demo3/
[root@pp ~]# cd demo3/
[root@pp demo3]# 
32.1.1 when判断中>、<、!=的使用
练习1:写一个playbook,判断某条件是否成立,成立了才执行task,否则不执行,命令
如下。
[root@pp demo3]# cat when-1.yaml 
---
- hosts: up
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 1<2
[root@pp demo3]# 
这里有一个task,判断1<2是否成立,如果成立则执行task1,屏幕上会显示111;如果不
成立则不执行taskl,屏幕上不会显示111。这里明显是成立的,所以会执行task1。运行结
果如下。
[root@pp demo3]# ansible-playbook when-1.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [tasks1] ****************************************************************************
ok: [up] => {
    "msg": "111"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

hen后面可以有多个条件,用or或and作为连接符。
如果用or作为连接符,只要有一个条件成立即可,只有所有的条件都不成立时,整体才不成
立。
练习2:修改when-1.yaml的内容如下。
[root@pp demo3]# cat when-1.yaml 
---
- hosts: up
  tasks:
  - name: tasks1
    debug: msg="111"
    when: 1<2 or 2>3
此处用or作为连接符,只要有一个条件成立就会成立,2>3不成立,但是1<2成立,所以
整体上就是成立的。运行结果如下。
[root@pp demo3]# ansible-playbook when-1.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [tasks1] ****************************************************************************
ok: [up] => {
    "msg": "111"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

常见的判断符包括以下6种。
(1)==:等于。
(2)!=:不等于。
(3)>:大于。
(4)>=:大于等于。
(5)<:小于。
(6)<=:小于等于。
练习:如果server2的系统主版本是7(RHEL/CentOS7),则打印111,否则不打印。
playbook的内容如下。
[root@pp demo3]# cat when-2.yaml 
---
- hosts: up
  tasks:
  - name: tasks2
    debug: msg="111"
    when: ansible_distribution_major_version == "7"
[root@pp demo3]# 
因为server2的系统是RHEL8,所以不会执行此task2,即不会显示111。
[root@pp demo3]# ansible-playbook when-2.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [tasks2] ****************************************************************************
skipping: [up]

PLAY RECAP *******************************************************************************
up                         : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

注意
ansible_distribution major version的值是一个字符串,所以when判断中=后面的7是要加引号
的。
练习2:修改when-2.yaml 的内容如下。
[root@pp demo3]# cat when-2.yaml 
---
- hosts: up
  tasks:
  - name: tasks2
    debug: msg="111"
    when: ansible_distribution_major_version == "8"
[root@pp demo3]# 
再次运行此playbook,命令如下,会显示111。
[root@pp demo3]# ansible-playbook when-2.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [tasks2] ****************************************************************************
ok: [up] => {
    "msg": "111"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@pp demo3]# 
再次提醒:在when 中引用变量时是不用加{{}}的。
32.1.2 when判断中in的用法
在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用 in,用法如
下。
1 value in 列表
如果此值在这个列表中,则判断成立,否则不成立。
练习:判断某值是否在列表中,编写 when-3.yaml,命令如下。
[root@pp demo3]# cat when-3.yaml 
---
- hosts: up
  vars:
    list1: [1,2,3,4]
  tasks:
  - name: task3
    debug: msg="333"
    when: 2 in list1
[root@pp demo3]# 
此处定义了一个列表 list1,里面有4个值,分别为1、2、3、4;定义了一个task打印333,
会不会执行这个task,就要看when后面的判断是否成立。如果2在列表list1中,则执行;如果
不在,则不执行,很明显2在列表list1中,所以会执行此task,即屏幕上会显示333。运行结
果如下。
[root@pp demo3]# ansible-playbook when-3.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [task3] *****************************************************************************
ok: [up] => {
    "msg": "333"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
因为2在列表list1中,when判断成立,可以正确执行task3,所以屏幕上会显示333。修
改when-3.yaml的内容如下。
[root@pp demo3]# cat when-3.yaml 
---
- hosts: up
  vars:
    list1: [1,2,3,4]
  tasks:
  - name: task3
    debug: msg="333"
    when: 2 not in list1
[root@pp demo3]# 
这里判断的是2不在列表list1中,但2是在列表list1中的,所以判断不成立。运行结果如
下。
[root@pp demo3]# ansible-playbook when-3.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [task3] *****************************************************************************
skipping: [up]

PLAY RECAP *******************************************************************************
up                         : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

[root@pp demo3]# 
因为when判断不成立,所以屏幕上不会显示333。回想前面的例子。
[root@pp demo3]# cat /root/demo2/9-inventory1.yaml 
---
- hosts: db
  tasks:
  - name: 打印我在清单文件中的名称
    debug: msg={{inventory_hostname}}
    when: inventory_hostname in groups ['xx']
[root@pp demo3]# 
这里判断当前正在执行的主机是不是属于主机组xx,如果是则执行debug,如果不是则不执
行。
32.1.3 when判断中is的用法
is可以用于判断变量是否被定义,常见的判断包括以下3种。
(1)is defined:变量被定义。
(2)is undefined:等同于is not defined,变量没有被定义。
(3)is none:变量被定义了,但是值为空。
看下面的例子。
[root@pp demo3]# cat when-4.yaml 
---
- hosts: up
  vars:
    aa: 1
    bb:
  tasks:
  - name: tasks1
    debug: msg="111"
    when: aa is undefined
  - name: tasks2
    debug: msg="222"
    when: bb is undefined
  - name: tasks3
    debug: msg="333"
    when: cc is not defined
[root@pp demo3]# 
首先定义了两个变量:aa和 bb,其中bb的值为空,此处并没有定义cc。后面定义了以下
3个task。
(1)如果aa被定义了,则显示111,这里aa被定义了,所以判断成立,会执行task1。
(2)如果b没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行
task2。
(3)如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行
task3。
这里is undefined 和is not defined是一个意思。
查看运行的结果,如下所示。
[root@pp demo3]# ansible-playbook when-4.yaml

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [tasks1] ****************************************************************************
skipping: [up]

TASK [tasks2] ****************************************************************************
skipping: [up]

TASK [tasks3] ****************************************************************************
ok: [up] => {
    "msg": "333"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   

32.2判断语句block-rescue
对于when来说,只能做一个判断,成立就执行,不成立就不执行。block和rescue一般
同用,类似于shell判断语句中的if-else,在block下面可以包含多个模块,来判断这多个模块
是否执行成功了。
block-rescue的用法如下。
1 block:
2 ‐ 模块1
3 ‐ 模块2
4 ‐ 模块3
5 rescue:
6 ‐ 模块1
7 ‐ 模块2
先执行 block中的模块1,如果没有报错,则继续执行模块2,如果block中的所有模块都
执行成功了,则跳过rescue 中的所有模块,直接执行下一个task中的模块,如图32-1所 示。
这里有2个task : task1和 task2,在 task1的block中有3个模块,rescue中有2个模块。
如果 block1中的所有模块都正确执行了,则不执行rescue中的模块,直接执行task2。
如果 block中的任一模块执行失败,block中其他后续的模块都不再执行,然后会跳转执行
rescue 中的模块,如图32-2所示。

这里block1中的模块1执行完成之后会执行模块2,如果模块2报错,则不会执行模块3,
直接跳转到rescue中,执行模块x。rescue中的所有模块全部正确执行完成之后,则执行
task2。
如果rescue中的某个模块执行失败,则退出整个playbook,如图32-3所示。
这里 block中的模块2执行失败,则跳转到rescue中执行模块x,如果模块x执行失败,则退
出整个 playbook,即也不会执行task2了。
如果某个报错模块有 ignore_errors: yes选项,则会忽略此模块的错误,继续执行下一个
模块,如图32-4所示。

这里block中的模块2执行失败了,但是因为加了ignore_errors: yes选项,所以会忽略这
个报错模块,继续执行模块3。
练习1:按上面的描述写一个playbook,内容如下。
[root@pp demo3]# cat block-1.yaml 
---
- hosts: up
  tasks:
  - name: task1
    block:
    - name: 11
      debug: msg="1111"

    - name: 22
      shell: "ls /aa.txt"

    - name: 33
      debug: msg="3333"

    rescue:
    - name: xx
      debug: msg="xxxx"
  
    - name: yy
      debug: msg="yyyy"
    - name: task2
      debug: msg="zzzz"
   
[root@pp demo3]# 
这里在task1的block中运行了3个模块,第一个模块可以正确执行,第二个模块是执行一
个系统命令ls /aa.txt,但是在server2中是不存在/aa.txt这个文件的,所以这个模块会执行
失败。block中的第三个模块不再执行,直接跳转到rescue中的模块。rescue中的2个模块均
可正确执行,然后执行task2。
所以,屏幕上会显示1111, xxxx, yyyy, zzzz。运行结果如下。
[root@pp demo3]# ansible-playbook block-1.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [debug] *****************************************************************************
ok: [up] => {
    "msg": "1111"
}

TASK [shell] *****************************************************************************
fatal: [up]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.009915", "end": "2023-12-22 11:38:31.526934", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 11:38:31.517019", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}

TASK [xx] ********************************************************************************
ok: [up] => {
    "msg": "xxxx"
}

TASK [yy] ********************************************************************************
ok: [up] => {
    "msg": "yyyy"
}

TASK [task2] *****************************************************************************
ok: [up] => {
    "msg": "zzzz"
}

PLAY RECAP *******************************************************************************
up                         : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

32.3 循环语句

在shell中 for循环的用法如下。
1 for i in A B C ... ; do
2 命令 $
3 done
这里首先把A赋值给i,执行do和done之间的命令;然后把B赋值给i,执行do和 done之间
的命令,以此类推,直到把in后面所有的值执行完毕。for后面的变量可以随便命名。
再回顾一下前面介绍的列表,如下所示。
1 employee:
2 ‐ uname: lisi
3 age: 22
4 sex: man
5
6 ‐ uname: wangwu
7 age: 24
8 sex: man
9
10 ‐ uname: xiaohua
11 age: 21
这里列表employee中有3个元素,分别记录了lisi、wangwu、xiaohua的信息。我们把
这3个元素当成刚讲的for循环中的A、B、C。先把第一个元素赋值给变量,执行某个操作,
完成之后再把第二个元素赋值给变量。
用for循环A、B、C,在playbook中用loop来循环列表中的元素。在for循环中,指定一个
变量如i,然后分别把A、B、C赋值给i。 在loop中,使用一个固定的变量 item,然后把每个元素赋值给item,如图32-5所示。第
二次循环,如图32-6所示。

练习1:定义一个列表users,然后循环这个列表中的每个元素,命令如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: up
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman

  tasks:
  - name: task1
    debug: msg={{ item }}
    loop: "{{ users }}"
[root@pp demo3]# 
这里定义了一个列表users,里面包含了3个用户的信息,在taskl中用loop开始循环这个
列表。loop后面写列表名时,需要使用引号引起来,这里的关键字loop可以换成关键字
with_items.
这里首先把users的第一个元素赋值给item,用debug 打印;然后把users的第二个元素赋
值给item,用 debug打印,直到把所有的元素都赋值给 item。
运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yaml 
PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": {
        "age": 20,
        "sex": "man",
        "uname": "tom"
    }
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": {
        "age": 22,
        "sex": "man",
        "uname": "bob"
    }
}
ok: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {
    "msg": {
        "age": 20,
        "sex": "woman",
        "uname": "mary"
    }
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

练习2:修改loop-1.yaml的内容如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: up
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman

  tasks:
  - name: task1
    debug: msg={{ item.uname }}
    loop: "{{ users }}"
[root@pp demo3]# 
列表的每个元素都是一个字典,所以 item就是字典,要获取这个字典中的uname变量,用
item.uname即可。
运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yaml 

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": "tom"
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": "bob"
}
ok: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {
    "msg": "mary"
}

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
练习3:如果想打印所有性别为男的那些用户名,修改loop-1.yaml 的内容如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: up
  vars:
    users:
    - uname: tom
      age: 20
      sex: man
    - uname: bob
      age: 22
      sex: man
    - uname: mary
      age: 20
      sex: woman

  tasks:
  - name: task1
    debug: msg={{ item.uname }}
    when: item.sex == "man"
    loop: "{{ users }}"
[root@pp demo3]# 
在此playbook中,我们用when加了一个判断。循环列表时,首先把第一个元素赋值给
item,然后判断item.sex的值是否为man,如果是则判断成立,执行debug模块;如果不是 则判断不成立,不执行debug模块。
第一次循环结束之后,开始第二次循环,把第二个元素赋值给item之后,做相同的判
断。运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yaml

PLAY [up] ********************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [up]

TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {
    "msg": "tom"
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {
    "msg": "bob"
}
skipping: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) 

PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@pp demo3]# 
这样就把所有性别为男的用户名打印出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1328063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python:删除空白

删除字符串末尾的空白 例如&#xff0c;下面的代码&#xff0c;变量hobby指向的字符串在末尾有一个空格&#xff1a; 可以使用函数rstrip()删除字符串末尾的空格&#xff0c;如下&#xff1a; 因为删除字符串末尾的空格并没有赋值给原变量hobby&#xff0c;所以此时查看hobb…

众和策略股市行情分析:股市里什么叫外资?外资股是什么?

股市里什么叫外资&#xff1f; 外资就是指的国外本钱&#xff0c;即国外出资者参与到我国股市所投入的本钱。通常情况下&#xff0c;外资主要靠直接或直接持有我国股市的股票来达成注入本钱的意图。比较于内资&#xff0c;外资更多的注重于我国商场的整体情况&#xff0c;采用…

什么是伦敦金的假突破?假突破为何有效?

部分投资者做伦敦金交易的时候喜欢追逐那些强势的行情&#xff0c;也就是我们所说的突破行情。但是突破行情会带来两种结果&#xff0c;一种是突破成功&#xff0c;而另一种是出现假突破。什么是伦敦金中的假突破呢&#xff1f;为什么假突破会有效呢&#xff1f;下面我们就来讨…

狮子目标检测数据集VOC+YOLO格式1400张

狮子&#xff08;Lion&#xff09;是一种生活在非洲和印度的大型猫科动物。它们是一种非常强壮和威猛的动物&#xff0c;通常被称为“草原之王”。狮子的身体结构非常适应于它们的生活方式&#xff0c;有着强壮的肌肉和锋利的牙齿。 狮子的身高一般在1.2-1.5米之间&#xff0c…

Ajax Search Pro Live WordPress网站内容实时搜索插件

点击阅读Ajax Search Pro Live WordPress网站内容实时搜索插件原文 Ajax Search Pro Live WordPress网站内容实时搜索插件是 WordPress 最好的实时搜索引擎插件。高度可定制&#xff0c;具有许多功能和选项&#xff0c;可提供最佳结果&#xff01;用更美观、更高效的搜索引擎替…

大数据---34.HBase数据结构

一、HBase简介 HBase是一个开源的、分布式的、版本化的NoSQL数据库&#xff08;即非关系型数据库&#xff09;&#xff0c;依托Hadoop分布式文件系统HDFS提供分布式数据存储&#xff0c;利用MapReduce来处理海量数据&#xff0c;用Zookeeper作为其分布式协同服务&#xff0c;一…

光条中心线提取-Steger算法 [OpenCV]

在线结构光视觉传感器中&#xff0c;由线激光器发射出的线结构光&#xff0c;在本质上为一个连续且具有一定厚度的空间光平面&#xff0c;而在目标表面上所形成的具有一定宽度的光条特征&#xff0c;即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上&#xf…

众和策略证券开户首选:股票增持是好还是坏?大股东增持规定?

股票增持是好仍是坏&#xff1f; 股东增持在一定程度上反映股东对个股比较看好&#xff0c;大量的买单&#xff0c;增加了市场上的多方力气&#xff0c;会推动股价上涨&#xff0c;是一种利好消息。 一般大股东会增持可能是上市公司运营成绩较好&#xff0c;具有较大的发展前…

DBeaver连接hive

1.新建hive连接 其中主机填写hive所在节点地址&#xff0c;端口10000为默认&#xff0c;数据库名不填则是默认default数据库&#xff0c;用户名密码填写hadoop集群中能操作hdfs的用户和密码。 2.编辑驱动&#xff0c;驱动的jar包从安装的hive下的jdbc路径下获取&#xff0c;例…

深度学习目标检测(2)yolov3设计思想

YOLOv3基础 YOLOv3算法基本思想可以分成两部分&#xff1a; 按一定规则在图片上产生一系列的候选区域&#xff0c;然后根据这些候选区域与图片上物体真实框之间的位置关系对候选区域进行标注。跟真实框足够接近的那些候选区域会被标注为正样本&#xff0c;同时将真实框的位置…

穿越边界:公链新星 Aptos 展望 2024 亚太区全新突破

主网仅上线一年&#xff0c;Aptos 为何凭借实力在 Web3 行业迅速出圈&#xff1f;是核心基建的突出技术优势&#xff0c;还是陪伴开发者的使命情怀&#xff1f;当我们与 Aptos 团队核心成员和生态项目创始人等近距离对话时&#xff0c;我们才能探索出初创项目的发展生存之道。 …

使用工具类Exectors创建线程池

大型并发项目 不能使用Executors 通过ThreadPoolExector的方式 核心线程配置方式: 计算密集型的任务 核心线程数量 CPU的核数 1 IO密集型的任务 核心线程数量 CPU的核数*2 演示: Callable import java.util.concurrent.Callable;public class MyCallable implements Callab…

逻辑斯蒂回归-建模概率计算(鸢尾花)

导入的数据说明 因为气候不同&#xff0c;造就性不同&#xff0c;统计鸢尾花的关键特征数据&#xff1a;花萼长度、花萼宽度、花瓣长度&#xff0c;花瓣宽度 植物学家划分&#xff1a; setosa(中文名&#xff1a;山鸢尾) versicolor(中文名&#xff1a;杂色鸢尾) virginica(中…

【实施】制作系统盘

文章目录 一、老毛桃装机重启前准备1.1 进入U盘启动盘1.1.1 U盘启动快捷键1.1.2 BIOS启动 1.2 具体操作1.3 实操演示 二、ultrasio制作U盘2.1 安装2.2 打开UltralSO.exe2.3 实操 一、老毛桃装机 重启前准备 准备一个16G以上的老毛桃U盘启动盘下载系统镜像文件&#xff0c;如在…

RocketMQ系统性学习-RocketMQ高级特性之消息存储的高效与刷盘策略、Broker 快速读取消息机制

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

C语言实现UCS2、UTF8与GBK2312编码转换

一、引言 在软件开发中&#xff0c;字符编码是一个非常重要的概念。不同的编码方式用于在不同的系统和应用中表示文本数据。UCS2、UTF8和GBK2312是三种常见的字符编码方式。为了实现不同编码间的转换&#xff0c;我们可以使用C语言进行编程&#xff0c;利用已有的库或者手动实…

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析(二)

上一篇中讨论了一般性的原则&#xff0c;这里我们具体讨论通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;的细节。我们将展示目标函数对于所有模型参数的梯度计算方法。 出于简单的目的&#xff0c;我们以一个没有偏置参数的循环神经…

找到最佳优惠券组合!Java算法助力电商平台策略优化

大家好&#xff0c;我是小米&#xff0c;一个热爱分享技术的小伙伴。最近我们电商平台迎来了一个新的需求&#xff0c;需要在用户下单时&#xff0c;高效地计算出多张平台券和店铺券的最优组合&#xff0c;使用户享受到最大的优惠。为了满足这一需求&#xff0c;我研究了一下动…

圣诞节快乐

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 圣诞节快到了&#xff0c;分享一个圣诞树给大家~ 效果展示&#xff1a; 源码分享&#xff1a; <svg class"mainSVG" xm…

HTML---盒子模型

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.盒子模型概述 HTML中的盒子模型是一种用于描述和布局元素的概念。每个 HTML 元素都可以被表示为一个矩形的盒子&#xff0c;这个盒子包括四个部分&#xff1a;内容区域、内边距、边框和外边距…