共享内存首先为一块实际物理内存,该块物理内存地址被映射到对应的不同进程地址空间中。
cat /proc/sys/kernel/shmmax 共享内存总体大小限制(以字节为单位)
cat /proc/sys/kernel/shmmni SHMMNI参数,这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改
cat /proc/sys/kernel/shmall SHMALL共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:ceil(SHMMAX/PAGE_SIZE)
shmget方法创建共享内存,或者访问一个已存在的共享内存区。
int shmget(key_t key, size_t size, int flag);
shmat方法映射共享内存与进程地址空间。
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmdt方法来释放映射关系
int shmdt(const void shmaddr);
shmctl ( ):共享内存控制
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmdt和shmctl的区别:
shmdt是将共享内存从进程空间detach出来,使进程中的shmid无效化,不可以使用。但是保留空间。而shmctl(sid, IPC_RMID, 0)则是删除共享内存,彻底不可用,释放空间。
ipcs -a 查看当前使用的共享内存、消息队列及信号量所有信息。
ipcs -p 命令可以得到与共享内存、消息队列相关进程之间的消息。
ipcs -u 命令可以查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数。
ipcs -l 命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息。
释放所有已分配的共享内存:
ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done
ZooKeeper是一个开源的的分布式服务框架,是Google Chubby的一个开源实现。主要用来解决分布式应用中经常遇到的,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
zookeeper适合写少读多。因为读不需要和leader交互。
ZooKeeper不适合作为大规模服务化场景下的注册中心,因为它是一个典型的CP系统。它的写操作存在单点问题,无法通过水平扩容来解决。当客户端发送写请求时,集群中的其他节点会优先转发给Leader节点,由Leader节点来负责具体的写入操作,只有当集群中N/2+1个节点都同步成功后,一次写操作才算完成。当服务扩容时,TPS越高,服务注册时的写入效率就越低,这会导致上游产生大量的请求排队,表象就是服务启动变得异常缓慢。
zookeeper使用zab协议(Zookeeper Atomic Broadcast 原子广播)。
zookeeper是最终一致。
在ZooKeeper集群中,每个节点共有3种角色和4种状态:
角色: leader,follower,observer
状态: leading,following,observing,looking
同一时刻ZooKeeper集群中只会有一个leader,其他的都是follower和observer。Observer不参与投票,默认情况下ZooKeeper中只有leader和follower两个角色。
“过半存活即可用”,整个集群如果对外要可用的话,那么集群中必须要有过半的机器是正常工作并且彼此之间能够正常通信。基于这个特性,那么如果想搭建一个能够允许F台机器down掉的集群,那么就要部署一个由2xF+1 台机器构成的ZK集群。
默认ZK是不会自动清理快照和事务日志,需要交给管理员自己来处理。
怀疑zk丢数据看dataVersion。(节点数据的更新次数)
dataLength: 节点数据的字节数。
ZK使用log4j作为日志系统。
znode节点类型:持久/临时 持久:写入后,session挂了,节点还在 临时:写入后,session挂了,节点被删
znode的ACL访问控制
模式1:digest 用户名/密码
模式2:ip 仅限指定IP访问
模式3:world 无权限控制
模式4:super 可以控制所有
模式5:IPMOD 指定IP并指定模块访问
zookeeper的典型使用场景:
—配置管理(数据的订阅、发布)
—服务注册与发现(名字服务)
—集群管理&master选举
—分布式锁
—分布式队列
server.A=B:C:D
其中A是一个数字,代表服务器编号,也是myid文件里面的值。集群中每台服务器编号都必须唯一,所以要保证每台服务器中的myid文件中的值不同。
B代表服务器的IP地址
C表示服务器与集群中leader服务器交换信息的端口
D表示选举时服务器相互通信的端口
myid这个文件只包含一个数字,和server id对应。
sh zkServer.sh all_zk_status
sh zkServer.sh status
leader表示对应的zk是主,follower代表是从,not running表示故障。
sh zkServer.sh start
sh zkCli.sh -server ip:port,其中ip为server端ip,port为ip对应端口
ip,port可以从配置文件中获取。
help ******查看可用命令。
ls / ******查看子znode。
ls / watch *******查看子znode并设置子节点watch
get / *******查看znode数据
addauth ipmod [name] ********添加zk访问权限
getAcl / ********查看znode的acl
create [-s] [-e] path data acl ********创建znode
其中-s表示创建顺序节点,-e表示创建临时节点
set path data *********修改znode的数据
stat / *********查看znode状态信息(ctime表示znode创建时间、mtime表示znode修改时间)
delete / *********删除znode及其子节点
quit *********退出
jps -l
ps -ef|grep zk
1.myid改名,让zk进程启动失败
2.sh zkServer.sh stop
https://zookeeper.apache.org/doc/r3.6.3/zookeeperTools.html
https://www.cnblogs.com/andy6/p/7674028.html
https://blog.csdn.net/weixin_36586120/article/details/120428292
http://logging.apache.org/log4j/1.2/manual.html#defaultInit
ZooKeeper—-Client端
http://www.cnblogs.com/ggjucheng/p/3376548.html
ZooKeeper 通信模型
https://www.cnblogs.com/ggjucheng/p/3376568.html
https://www.cnblogs.com/andy6/p/7674028.html
https://xiaoxiami.gitbook.io/zookeeper/
zookeeper Acl权限控制
https://codeantenna.com/a/zBcPKsr9ll
zookeeper客户端 zkCli使用及常用命令
https://www.cnblogs.com/yangzhenlong/p/8271151.html
zk 常用命令 https://ld246.com/article/1535880755991
$@:表示脚本参数的内容。
$#:表示脚本参数的个数。
$?: 表示函数的执行状态
$0: 脚本名本身
$?: 最后一个后台进程的ID号
$1: 表示第一个参数
${10}: 第十个参数,当位置参数的个数大于9时,需要用${}括起来标识
获取shell函数结果:$?
1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
2)用$?来接收函数的执行状态,但是$?要紧跟在函数调用处的后面。
date +"%Y-%m-%d %H:%M:%S”
function log()
{
echo "[$(date "+%Y-%m-%d %H:%M:%S.%N")][$$] $@"
}
注意点:
数值太大不可为算数计算的基:
如果数字是以0开头的,bash误以为是进制,如month=08,八月,bash默认为八进制,若要转为10进制,需要这样写10#${month}
https://codeantenna.com/a/OVRAo1GRqC
local start_time=$(date +%s -d '2017-09-01 12:00:00')
sleep 1500
local current_time=$(date +%s -d '2017-09-01 12:00:00')
local delta_time=`expr $current_time - $start_time`
date +%Y%m%d //显示前天年月日
date +%Y%m%d –date=”+1 day” //显示前一天的日期
date +%Y%m%d –date=”-1 day” //显示后一天的日期
date +%s //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)
function help()
{
cat << EOF
------------------------------help---------------------------------
EOF
}
case $action in
aaa)
aaa
;;
bbb)
bbb
;;
ccc)
ccc
;;
help)
help
;;
*)
esac
文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]
-b file检测文件是否是块设备文件,如果是,则返回 true。
-c file检测文件是否是字符设备文件,如果是,则返回 true。
-d file检测文件是否是目录,如果是,则返回true。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true。
-p file检测文件是否是具名管道,如果是,则返回 true。
-u file检测文件是否设置了SUID 位,如果是,则返回true。
-r file检测文件是否可读,如果是,则返回true。
-w file检测文件是否可写,如果是,则返回 true。
-x file检测文件是否可执行,如果是,则返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。
=检测两个字符串是否相等,相等返回true。
!=检测两个字符串是否相等,不相等返回true。
-z检测字符串长度是否为0,为0返回true。
-n检测字符串长度是否为0,不为0返回true。
str检测字符串是否为空,不为空返回 true。
https://blog.csdn.net/shimazhuge/article/details/38703523
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq:equal
-ne:not equal
-gt:greater than
-lt:less than
-ge:greater or equal
-le:less or equal
#-o 或运算 or
#-a 与运算 and
要在Linux Bash Shell中进行算术运算,有三种写法
let “sum=3+5” # sum <- 8 等号右边以及运算符和括号的两边都不能有空格
sum=`expr 2 - 5` # sum <- -3
注意: 乘号(*), 左括号( , 右括号)必须使用反斜杠(\)转义。expr右边以及运算符和括号的两边必须有空格; 如果采用紧凑的写法(紧凑格式可以不对*, (, )进行转义), 则返回算术表达式.
sum=$((3+5)) # sum <- 8
无需对运算符和括号做转义处理,也可以采用松散或紧凑的格式.
! 逻辑非
-a 逻辑与
-o 逻辑或
#!/bin/sh #本脚本测试shell脚本中整型变量自增 加1的几种方法
#定义整型变量 a=1 echo $a
#第一种整型变量自增方式 a=$(($a+1)) echo $a
#第二种整型变量自增方式 a=$[$a+1] echo $a
#第三种整型变量自增方式 a=`expr $a + 1` echo $a
#第四种整型变量自增方式 let a++ echo $a
#第五种整型变量自增方式 let a+=1 echo $a
#第六种整型变量自增方式 ((a++)) echo $a
https://blog.csdn.net/taiyang1987912/article/details/38929069
for 循环(任何空白字符都可以作为其读取的分隔符)
while 循环(使用换行符作为行标记)
while循环读取文件中的内容有两种写法,一种是管道符,一种是重定向
管道符:
cat $file_name | while read line
do
#####
done
重定向:
while read line
do
#####
done < $file_name
until 循环
select 循环
https://blog.csdn.net/xuejianbest/article/details/98486256
https://blog.csdn.net/Ls4034/article/details/76005929
Shell变量while循环内改变无法传递到循环外
Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。
(1) 顺序执行的代码
(2) 并行代码
使用’&’+wait 实现“多进程”实现
#!/bin/bash
date
for i in `seq 1 5`
do
{
echo "sleep 5"
sleep 5
} &
done
wait ##等待所有子后台进程结束
date
(3) 对于大量处理任务如何实现启动后台进程的数量可控?
简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成。
但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。
更高级的实现可以看(4)
(4) 使用命名管道(fifo)实现每次启动后台进程数量可控。
#!/bin/bash
function my_cmd(){
t=$RANDOM
t=$[t%15]
sleep $t
echo "sleep $t s"
}
tmp_fifofile=”/tmp/$$.fifo”
mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile #删也可以
thread_num=5 # 最大可同时执行线程数量
job_num=100 # 任务总数
#根据线程总数量设置令牌个数
for ((i=0;i<${thread_num};i++));do
echo
done >&6
for ((i=0;i<${job_num};i++));do # 任务数量
\# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
\# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
read -u6
\#可以把具体的需要执行的命令封装成一个函数
{
my_cmd
} &
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
done
wait
exec 6>&- # 关闭fd6
echo “over”
https://www.runoob.com/linux/linux-shell.html
https://www.cnblogs.com/hider/p/11834706.html
https://blog.csdn.net/readnap/article/details/105047518
字符串比较防止空串
https://wangdoc.com/bash/arithmetic.html
$[]
$(())
bc
declare-a Array
${Array[@]} 得到的是以空格隔开的元素值
${Array[*]}得到的是一整个字符串
4种引用符:双引号,单引号,反引号,转义符
部分引用:双引号括起来的引用,$,`,\会被解析为特殊含义
全引用:单引号括起来的引用
# 外部输入校验
pool_id=$1
if [[ ! "$pool_id" =~ ^[0-9]+$ ]];
then
echo "param error: invalid pool_id."
exit 1
fi
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
ip=(${ip//\./ }) # 按.分割,转成数组,方便下面的判断
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
ret=$?
fi
ip addr |grep "inet "|grep -v "127.0.0.1"|awk -F'/' '{print $1}'|awk '{print $2}'
文件标识符也是一种”设备”,这个标识符会出现在/dev/fd目录中
主动打开的文件标识符需要主动关闭,否则除了系统重启,该文件标识符会一直被占用
https://blog.csdn.net/ygqygq2/article/details/72822250
# 输入格式:121.37.63.0/24,223.117.173.0/24
#!/bin/bash
string=$1
array=(${string//,/ })
for var in ${array[@]}
do
iptables -D INPUT -p tcp –dport 443 -s $var -j DROP
iptables -D INPUT -p tcp –dport 80 -s $var -j DROP
done
1.用date相减
2.用time工具
| ps -eo s,cmd | grep 进程名 |
| ps -aux | grep 进程名 |
ps -eo etime,comm | 进程名
| ps -eo pid,lstart,etime | grep [进程id] |
https://cloud.tencent.com/developer/article/1398514
(1)作用不同。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。 而return是返回函数值并退出函数;
(2)语义层级不同。 return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束;
(3)使用方法不同。return一般用在函数方法体内,exit可以出现Shell脚本中的任意位置。
exit
exit会附带清理工作,比如全局对象、静态对象的析构,别的线程还在跑,很容易发生一些难以预测的结果。(代码中尽量不要用)
exit的清理工作还没做完,进程不会退出,别的线程还在跑,一访问被析构掉的静态对象就core了
#!/bin/bash
echo "第一个参数为:$1";
echo "第二个参数为:$2";
for i in "$@";
do
echo $i;
done
for i in "$*";
do
echo $i;
done
if [ $2 ]then
echo "存在第二个参数"
else
echo "不存在第二个参数"
fi
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
perf是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。
Perf可以对程序进行函数级别的采样,从而了解程序的性能瓶颈在哪里。其基本原理是:每隔一个固定时间,就是CPU上产生一个中断,看当前是哪个进程、哪个函数,然后给对应的进程和函数加一个统计值,这样就知道CPU有多少时间在某个进程或某个函数上了。具体原作原理就是直接通过系统调用syscall/ioctl或者监听SW的event来看性能。
perf支持两种模式,计算模式和采样模式。比如,perf stat使用的是计算模式,而perf record采用的是采样模式。拿采样来说,它的原理是这样的:每隔一个固定的时间,产生一个中断,然后统计对应的pid和函数。采样就预示着与实际运行情况并不能保持一致,但如果一个函数运行的时间越长,被时钟中断的机会就越大。鉴于perf最终显示的是统计值,所以它的测量结果是高度可信的。
perf包含了多个工具,使用perf –help可以看到perf的二级命令,其中,perf top类似于top命令,可以对系统性能进行实时分析。
perf --help 查看perf的二级命令
perf top #查看cpu执行情况
perf top -p pid #查看某个进程所有函数占用cpu信息
perf top -g -p pid #查看特定函数的抵用关系
perf top -t tid / perf record -t tid #查看单线程信息
perf record -a #采样,当前目录生成perf.data文件。
perf record -g -p pid #将信息输出到文件
perf report #显示类似于perf top的报告
https://github.com/cobblau/FlameGraph
火焰图(CPU Flame Graphs)是一个将CPU调用栈可视化的应用,需要使用perf, eBPF等tracer工具生成数据,然后进行可视化生成svg图片。
git clone https://github.com/brendangregg/FlameGraph.git
perf record -F 99 -a -g -p pid sleep 60
其中,-F 99 表示采样频率,每秒99次;-a表示采集所有CPU的信息,-g表示记录函数调用栈, -p pid 表示追踪进程号为pid的进程,对于多个进程号,用逗号’,’分隔,sleep 60 要求采集1分钟的数据。
perf script > out.perf #perf script 工具对生成的perf.data进行解析
./stackcollapse-perf.pl out.perf > out.folded #对符号进行折叠
./flamegraph.pl out.folded >perf.svg #生成svg图
系统级性能分析工具perf的介绍与使用
https://www.cnblogs.com/arnoldlu/p/6241297.html
perf + Flame Graph火焰图分析程序性能
https://www.cnblogs.com/felixzh/p/8932984.html
rsync工作机制(翻译)
https://www.cnblogs.com/f-ck-need-u/p/7221535.html#auto_id_4
下载链接:http://www.rpmfind.net/linux/rpm2html/search.php?query=perf
安装命令:rpm -ivh *.rpm
中文手册:http://linux.51yip.com/search/perf
perf的原理,编译以及使用
https://blog.csdn.net/u013983194/article/details/112209853
一文搞定 Perf 和 Gpertools https://www.51cto.com/article/653774.html
https://blog.csdn.net/qq_41185868/article/details/103895753
https://blog.csdn.net/weixin_35653315/article/details/71642154
https://cloud.tencent.com/developer/article/1796559
https://www.cnblogs.com/ocean1100/p/9276024.html
from future import print_function
安装python3
tar -zxvf Python-3.6.5.tgz
./configure –enable-optimizations –prefix=/usr1/python3
make && make install
ln -s /usr1/python3/bin/python3.6 /usr/bin/python3
ln -s /usr1/python3/bin/pip3.6 /usr/bin/pip3
///安装python3
yum -y install python3
yum -y install python3-devel
Python3.7 ssl模块导入失败的解决办法
https://blog.csdn.net/bluehawksky/article/details/89540842
安装pip
///安装pip包(–trusted-host pypi.tuna.tsinghua.edu.cn)
python3 -m pip install –upgrade pip -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install etcd3 -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
python3 -m pip install grpcio -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
python3 -m pip install grpcio-tools -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
python3 -m pip install jump-consistent-hash -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
python3 -m pip install configobj -i http://mirrors.aliyun.com/pypi/simple –trusted-host mirrors.aliyun.com
pwntools等安装
python3 setup.py install
pip3 install .
安装完成后,打开python测试, 执行from pwn import *不会报错即可。
Google搜索:*** pypi
from __future__ import print_function
if sys.version_info < (3, 0):
print (tmp_hex.decode('hex'))
else
print (str(bytes.fromhex(tmp_hex),encoding = "utf-8"))
EOF
https://www.jianshu.com/p/e485c82dcff9
https://blog.51cto.com/u_9595448/3273887
我们平常用的pycharm里面用Ctrl + alt + L 快捷键可以修改大部分的代码格式问题
CPython: 用C语言编写的Python解释器
PyPy: 用python语言编写的Python解释器
IronPython: 用.net编写的Python解释器
Jython:用Java编写的Python解释器
步骤:
1. 下载安装包 3.x 2.x
2. 安装(傻瓜式安装)
3. 打开命令行窗口,输入python
交互模式只能你输入一行代码,它就执行一行,所以他并不适用于我们日常开发
1. 在Sublime中执行python代码,ctrl+b 自动在内置的控制台中执行
2. 使用SublimeREPL来运行python代码
{"keys":["f5"], "caption":"SublimeREPL:Python", "command":"run_existing_window_command", "args":{"id": "repl_python_run","file": "config/Python/Main.sublime-menu" }},
3. 表达式
表达式就是类似于数学公式的东西
表达式一般仅仅用于计算一些结果,不会对程序产生实质性的影响
语句
在程序中语句一般需要完成某种功能,比如打印信息,获取信息,为变量赋值
在交互模式中不一定会输出语句的执行结果
程序(program)
程序就是由一条一条的语句和一条一条的表达式构成的
函数(function)
函数就是一种语句,函数专门用来完成特定的功能
函数的分类:内置函数,自定义函数
内置函数:由python解释器提供的函数,可以在Python中直接使用
自定义函数:由程序员自主的创建的函数
函数的两个要素:
参数
-()中的内容就是函数的参数
- 函数中可以没有参数,也可以有多个参数,多个参数之间使用“,”隔开
返回值
严格区分大小写
一条语句可以分多行编写,语句后边以\结尾
Python是缩进严格的语言,所以在python中不要随便写缩进
在Python中使用#来表示注释,#后的内容都属于注释,注释的内容将会被解释器所忽略
变量可以用来保存字面量,并且变量中保存的字面量是不定的
在python中所有可以自主命名的内容都叫做标识符
比如:变量名,函数名,类名
Python数值分为三种:整数,浮点数(小数),复数
在python中所有的整数都是int类型
Python中的整数的大小没有限制,可以是一个无限大的整数
数字长度过大,可以使用下划线作为分隔符
Python 是一门面向对象的语言。
一切皆对象。
程序运行当中,所有的数据都是存储到内存。
类型转换四个函数 int(), float(), str(), bool()
运算符(操作符)
运算符可以对一个值或多个值进行运算或各种操作
比如+、-、= 都属于运算符
运算符的分类:
1.算术运算符
+ 加法运算符(如果是两个字符串之间进行加法运算,则会进行拼串操作)
- 减法运算符
* 乘法运算符(如果将字符串和数字相乘,则会对字符串进行复制操作,将字符串重复指定次数)
/ 除法运算符,运算时结果总会返回一个浮点类型
// 整除,只会保留计算后的整数位,总会返回一个整型
** 幂运算,求一个值的几次幂
% 取模,求两个数相除的余数
2.赋值运算符
可以将等号右侧的值赋值给等号左侧的变量
3.比较运算符(关系运算符)
4.逻辑运算符
not 逻辑非
and 逻辑与
or 逻辑或
5.条件运算符(三元运算符)
语法: 语句1 if 条件表达式 else 语句2
max = a if a > b and a > c else b if b > c else c